为什么可以通过类实例访问类变量?



>我创建了没有实例变量的类Circle。我添加了一个类方法from_diameter来生成具有给定直径的圆。

class Circle:
@classmethod
def from_diameter(cls, diameter):
cls.diameter = diameter
return cls

diameter是一个类(静态(变量。但是 - 它看起来也作为实例变量和类变量存在。

myCircle = Circle.from_diameter(10)
print Circle.diameter
print myCircle.diameter

输出:

10
10

为什么有效?没有实例变量diameter。 我想print myCircle.diameter应该抛出一个错误。

没有实例变量,只是 Python 对象中的名称查找首先查看实例,然后,如果没有找到匹配项,则查找类。

类实例

类实例是通过调用类对象创建的(见上文(。类实例具有一个实现为字典的命名空间,该字典是搜索属性引用的第一个位置。如果在那里找不到属性,并且实例的类具有该名称的属性,则继续搜索类属性。[...]如果未找到类属性,并且对象的类具有__getattr__()方法,则调用该方法以满足查找。

(蟒蛇 2, 蟒蛇 3(

当您尝试使用它仅查看的类访问变量时

cls.__dict__

但是当您尝试使用实例访问变量时,它首先看起来

self.__dict__ 

如果找到则返回,或者如果找不到,则也会查找

cls.__dict__

这里 CLS 是类

class Test:
temp_1=10
temp_2=20
def __init__(self):
self.test_1=10
self.test_2=20
@classmethod
def c_test(cls):
pass
def t_method(self):
pass

print Test.__dict__
print Test().__dict__

输出

{'c_test': <classmethod object at 0x7fede8f35a60>, '__module__': '__main__', 't_method': <function t_method at 0x7fede8f336e0>, 'temp_1': 10, '__doc__': None, '__init__': <function __init__ at 0x7fede8f335f0>, 'temp_2': 20}
{'test_2': 20, 'test_1': 10}

对于详细信息类特殊属性

相关内容

  • 没有找到相关文章

最新更新