类变量无法对实例变量执行属性查找



我在玩和学习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的深度会很有帮助。如果有人能给它点光的话,请帮忙。

您没有在__init__中使用age = 12设置属性。您所做的一切都定义了一个本地变量,该变量将在__init__完成时收集垃圾。

您必须使用abc.age = 12来实际设置类abc
(或type(self).age = 12(的属性。

我假设这是一个教育性的例子,否则在课堂上为那些看起来像是模特的人设定年龄并不是很有用。

每次调用__init__时重新设置类属性也是多余的。

每次在类中定义变量时,都会在的范围或实例范围中定义变量。height = 180行定义了类作用域中的高度(类作用域基本上是类的全局作用域(。self.age = 12self.name = name行定义了实例范围中的agename(实例范围基本上是本地范围(。

在python中,如果您对实例(如ee.height(执行属性查找,则实例首先在实例范围中搜索变量height,如果在那里找不到,则实例在类范围中搜索。但是,如果使用类(如abc.age(执行属性查找,则该类无法访问本地实例范围,因此只能在类范围中搜索变量年龄。由于类作用域中没有可变年龄,因此它会返回属性错误

最新更新