尽管可以接受,但我还是要添加一些描述。
做个小运动
首先定义一个类如下:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
那我们这里有什么?
- 我们有一个非常简单的类,它的属性
temp是字符串
- 一个
__init__其中集方法self.x
- 变更方法集
self.temp
到目前为止挺直截了当的,是吗?现在让我们开始玩这个课。让我们首先初始化该类:
a = A('Tesseract')
现在执行以下操作:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
好吧,a.temp按预期工作,但是到底怎么了A.temp?之所以有效,是因为temp是一个类属性。python中的所有内容都是一个对象。这里A也是class的对象type。因此,属性temp是A该类拥有的属性,如果通过A(而不是通过的一个实例a)更改temp的值,则更改后的值将反映在A该类的所有实例中。让我们继续这样做:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
有趣吗?并且请注意,id(a.temp)和id(A.temp)仍然相同。
任何Python对象都会自动获得一个__dict__属性,其中包含其属性列表。让我们研究一下该词典为示例对象包含的内容:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
请注意,该temp属性在A类的属性x中列出,而为实例列出。
那么,为什么a.temp没有为实例列出定义的值呢a?这就是__getattribute__()方法的魔力。在Python中,虚线语法会自动调用此方法,因此在我们编写时a.temp,Python将执行a.__getattribute__('temp')。该方法执行属性查找操作,即通过在不同位置查找来找到属性的值。
__getattribute__()搜索的标准实现是先搜索对象的内部字典(dict),然后搜索对象本身的类型。在这种情况下,a.__getattribute__('temp')先执行a.__dict__['temp'],然后执行a.__class__.__dict__['temp']
好吧,现在让我们使用我们的change方法:
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
好了,现在我们使用了self,print(a.temp)给我们带来了与众不同的价值print(A.temp)。
现在,如果我们比较id(a.temp)和id(A.temp),它们将有所不同。
list用作属性名称。list是用于构建新列表的内置函数。您应使用大写字母写姓名类别。