实例属性
实例仅拥有数据属性,它是与某个类的实例相关联的数据值,这些值独立于其他实例或类。当一个实例被释放后,它的属性同时也被清除了。
设置实例的属性可以在实例创建后任意时间进行,也可以在能够访问实例的代码中进行。构造器 __init__() 是设置这些属性的关键点之一。
内建函数 dir() 可以显示类属性,同样还可以打印所有实例属性:
>>> class C():
... pass
...
>>> c = C()
>>> c.foo = 'roger'
>>> c.bar = 'shrubber'
>>> dir(c)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form
at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__qualname__', '__reduce__', '__r
educe_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook
__', '__weakref__', 'bar', 'foo']
实例也有一个 __dict__特殊属性,它是实例属性构成的一个字段:
>>> c.__dict__
{'foo': 'roger', 'bar': 'shrubber'}
特殊的实例属性:
I.__class__ | 实例化I的类 |
I.__dict__ | I 的属性 |
类属性
类属性仅与其被定义的类相绑定。类数据属性仅当需要有更加“静态”数据类型时才变得有用,它和任何实例都无关。
>>> class C(object):
... foo = 100
...
>>> print(C.foo)
100
>>> C.foo = C.foo + 1
>>> print(C.foo)
101
要知道一个类有哪些属性,有两种方法。最简单的是使用 dir() 内建函数。另外是通过访问类的字典属性 __dict__。
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form
at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__qualname__', '__reduce__', '__r
educe_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook
__', '__weakref__', 'myVersion', 'showMyVersion']
>>> MyClass.__dict__
mappingproxy({'__module__': '__main__', '__qualname__': 'MyClass', '__weakref__'
: <attribute '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyC
lass.showMyVersion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass
' objects>, 'myVersion': '1.1', '__doc__': 'MyClass class definition'})
dir() 返回的仅是对象的属性的一个名字类表,而 __dict__ 返回的是一个字典,它的键(key)是属性名,键值(value)是相应的属性对象的数据值。
特殊的类属性:
C.__name__ | 类C的名字(字符串) |
C.__doc__ | 类C的文档字符串 |
C.__bases__ | 类C的所有父类构成的元组 |
C.__dict__ | 类C的属性 |
C.__module__ | 类C定义所在的模块 |
C.__class__ | 实例C对应的类 |
>>> MyClass.__name__
'MyClass'
>>> MyClass.__doc__
'MyClass class definition'
>>> MyClass.__bases__
(<class 'object'>,)
>>> print(MyClass.__dict__)
{'__module__': '__main__', '__qualname__': 'MyClass', '__weakref__': <attribute
'__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVe
rsion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '
myVersion': '1.1', '__doc__': 'MyClass class definition'}