鱼C论坛

 找回密码
 立即注册
查看: 2152|回复: 8

关于类和实例的疑问

[复制链接]
发表于 2017-9-20 20:30:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:
  1. class Car():
  2.     """一次模拟汽车的简单尝试"""

  3.     def __init__(self,make,model,year):
  4.         """初始化描述汽车的属性"""
  5.         self.make = make
  6.         self.model = model
  7.         self.year = year
  8.         self.odometer_reading = 0

  9.     def get_descriptive_name(self):
  10.         """返回整洁的描述信息"""
  11.         long_name = str(self.year) + ' ' + self.make + ' ' + self.model
  12.         return long_name.title()

  13.     def read_odometer(self):
  14.         """打印一条指出汽车里程的消息"""
  15.         self.a = 1
  16.         print(self.a)
  17.         print("This car has " + str(self.odometer_reading) + " miles on it.")

  18. my_new_car = Car('BMW','5',2016)
  19. my_new_car.get_descriptive_name()
  20. my_new_car.odometer_reading = 2
  21. my_new_car.a = 2
  22. my_new_car.read_odometer()
复制代码


运行后结果如下:
  1. 1
  2. This car has 2 miles on it.

  3. Process finished with exit code 0
复制代码



问题如下:
源码中倒数第三行my_new_car.odometer_reading = 2直接修改属性生效,而倒数第二行my_new_car.a = 2却没生效,这是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-20 20:58:17 | 显示全部楼层
你把a的初始赋值放在 __init__里面初始
  1. class Car():
  2.     """一次模拟汽车的简单尝试"""

  3.     def __init__(self,make,model,year):
  4.         """初始化描述汽车的属性"""
  5.         self.make = make
  6.         self.model = model
  7.         self.year = year
  8.         self.odometer_reading = 0
  9.         self.a = 1

  10.     def get_descriptive_name(self):
  11.         """返回整洁的描述信息"""
  12.         long_name = str(self.year) + ' ' + self.make + ' ' + self.model
  13.         return long_name.title()

  14.     def read_odometer(self):
  15.         """打印一条指出汽车里程的消息"""
  16.         print(self.a)
  17.         print("This car has " + str(self.odometer_reading) + " miles on it.")

  18. my_new_car = Car('BMW','5',2016)
  19. my_new_car.get_descriptive_name()
  20. my_new_car.odometer_reading = 2
  21. my_new_car.a = 2
  22. my_new_car.read_odometer()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-20 21:26:45 | 显示全部楼层
新手·ing 发表于 2017-9-20 20:58
你把a的初始赋值放在 __init__里面初始

我尝试放在__init__以及get_descriptive_name(self) 里,都可以正确修改。唯独def read_odometer(self)里面无法修改成功。

何解?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-20 21:31:01 | 显示全部楼层
八千年 发表于 2017-9-20 21:26
我尝试放在__init__以及get_descriptive_name(self) 里,都可以正确修改。唯独def read_odometer(self)里 ...

你把print改成return试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-20 21:46:10 | 显示全部楼层
新手·ing 发表于 2017-9-20 21:31
你把print改成return试试

return 什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-20 21:47:14 | 显示全部楼层

最后一个函数的print
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-21 09:13:16 | 显示全部楼层
新手·ing 发表于 2017-9-20 21:47
最后一个函数的print

可以了...能解释下原理么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-21 10:11:12 | 显示全部楼层
首先你实例化了一个Car类,对象名为:my_new_car
在第25行之前,my_new_car这个实例是没有a这个属性的...
这25行的之后,my_new_car这个实例增加了a这个属性,并赋值为2
后面调用read_odometer成员函数时:self指的就是my_new_car
第18行的时候你又给my_new_car.a进行了赋值....所以给你的直观感觉是25行的表达式没有生效....
你可以在25行后增加一个print(my_new_car.a)
查看结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-28 14:45:27 | 显示全部楼层
SuMo 发表于 2017-9-21 10:11
首先你实例化了一个Car类,对象名为:my_new_car
在第25行之前,my_new_car这个实例是没有a这个属性的...
这 ...

25行之前,第16行的方法中【18行】已经包含了a这个属性了:self.a = 1.
我在25行的表达式用意是将18行的a的值直接修改成2.  是不是这里的逻辑有问题?没修改成功。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 12:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表