我在玩耍和学习python OOP的广泛主题时观察到,创建的类实例可以访问类变量,但是该类不能调用用类定义的实例变量
class abc():
height=180
def __init__(self,name):
self.age=12
self.name=name
ee=abc("Muhammad")
print(ee.height)
print(abc.height)
输出
180
180
但是,如果我尝试直接通过类名访问类变量,则会引发错误。
ee=abc("Muhammad")
print(ee.height)
print(abc.age)
输出
AttributeError: class abc has no attribute 'age'
因此,我观察到了这一点,并认为与初学者分享python OOP的深度会有所帮助。如果有人可以给它照一下,请。
答案 0 :(得分:3)
您没有在age = 12
中用__init__
设置属性。您所做的全部工作都定义了一个局部变量,该变量将在完成__init__
后收集垃圾。
您必须使用abc.age = 12
来在类abc
上实际设置属性
(或type(self).age = 12
)。
我假设这是一个教育性的例子,否则在类中设置年龄以模仿人似乎不是很有用。
每次调用__init__
时重置类属性也是多余的。
答案 1 :(得分:0)
每次在类中定义变量时,要么在 class 的范围内定义变量,要么在 instance 的范围内定义变量。第height = 180
行定义了类范围的高度(类范围基本上是该类的全局范围)。 self.age = 12
和self.name = name
行在实例范围内定义 age 和 name (实例范围基本上是本地范围)。
在python中,如果您对某个实例(例如ee.height
)执行属性查找,则该实例首先在实例范围内搜索变量 height ,如果在实例范围内找不到该变量然后实例在类范围内搜索。但是,如果使用类(例如abc.age
)执行属性查找,则该类无法访问本地实例范围,因此只能在类范围中搜索变量age。由于类作用域中没有变量年龄,因此它返回 Attribute Error 。