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

时间:2018-10-26 17:39:11

标签: python oop

我在玩耍和学习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的深度会有所帮助。如果有人可以给它照一下,请。

2 个答案:

答案 0 :(得分:3)

您没有在age = 12中用__init__设置属性。您所做的全部工作都定义了一个局部变量,该变量将在完成__init__后收集垃圾。

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

我假设这是一个教育性的例子,否则在类中设置年龄以模仿人似乎不是很有用。

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

答案 1 :(得分:0)

每次在类中定义变量时,要么在 class 的范围内定义变量,要么在 instance 的范围内定义变量。第height = 180行定义了类范围的高度(类范围基本上是该类的全局范围)。 self.age = 12self.name = name行在实例范围内定义 age name (实例范围基本上是本地范围)。

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