属性就是属于一个对象的数据或者函数元素,可以通过我们熟悉的据点属性标识法来访问。
类属性包含类的数据属性和方法属性(函数),类属性只与其定义的类相关。
访问类的字典属性__dict__可以获得类属性。
class Test(object):
v = 0.1
def test(self):
pass
>Test.__dict__
>{'__module__': '__main__', '__dict__': '__dict__' of 'Test' objects>, 'v': 0.1, 'test': 0x2ee3cf8>, '__weakref__': '__weakref__' of 'Test' objects>, '__doc__': None}
除了定义的v, test, __init__ 属性外,还有一些特殊的类属性。
attribute | desc |
---|---|
__name__ | 类的名字字符串 |
__doc__ | 类的文档字符串 |
__bases__ | 类的基类元组 |
__dict__ | 类的属性 |
__module__ | 类定义所在的模块 |
__class__ | 类对象对应的类 |
类实例化后具有的属性,通过__dict__方法可以获取实例属性。
class Test(object):
v = 0.1
def __init__(self):
self.info = 'test'
t = Test()
>t.__dict__
>{'info': 'test'}
严格来说,实例属性应只包含数据属性。
但其实我们可以给实例增加方法属性。
class Test(object):
pass
t = Test()
def fun():
pass
t.f = fun
>t.__dict__
>{'f': }
下面举几个例子说明类属性和方法属性。
class Test(object):
v = 1
t = Test()
print t.v # 类属性,1
print Test.v # 类属性,1
t.v = 2 # 修改实例属性,此处类属性不变(当且仅当实例属性为不可变对象)
print t.v # 实例属性,2
print Test.v # 类属性,1
del t.v # 删除实例属性
print t.v # 访问类属性,1
Test.v = 2 # 修改类属性
print Test.v # 访问类属性,2
print t.v # 访问类属性,2
注意:
1.内建函数dir可以用来查看类属性和实例属性,但得到的内容比预期要多。
2.虽然类属性不是实例属性,但类的实例可以访问类的属性。
3.不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。