尽管可以接受,但我还是要添加一些描述。
做个小运动
首先定义一个类如下:
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
是用于构建新列表的内置函数。您应使用大写字母写姓名类别。