二、类属性
1、类的数据属性
数据属性仅仅是所定义的类的变量,它们可以像任何其它变量一样在类创建后被使用。并且,要么由类中的方法来更新,要么是在主程序其他什么地方更新。
这种属性叫静态变量或静态数据,它们表示这些数据是与它们所属的类对象绑定的,不依赖于任何类实例。
>>> class C(object):
... foo = 100
...
>>> print(C.foo)
100
>>> C.foo = C.foo + 1
>>> print(C.foo)
101
2、方法:是它所在类的固有属性,即使它们几乎都是通过实例来调用的
>>> class MyClass(object):
... def myNoActionMethod(self):
... pass
...
>>> mc = MyClass()
>>> mc.myNoActionMethod()
3、绑定(绑定及非绑定方法)
Python严格要求,没有实例,方法是不能被调用的。这种限制即Python所描述的绑定概念。
在此,方法必须绑定到一个实例才能直接被调用。非绑定的方法可能可以被调用,但实例对象一定要明确给出,才能保证调用成功。
>>> myNoActionMethod()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'myNoActionMethod' is not defined
>>> MyClass.myNoActionMethod()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: myNoActionMethod() missing 1 required positional argument: 'self'
4、查看类的属性
内建函数:
dir(): 返回对象属性的一个名字列表
vars(): 返回类__dict__属性的内容
__dict__: 返回一个字典,键是属性名,键值是相应属性对象的数据值
class MyClass(object):
'MyClass class definition'
myVersion = 1.1 # 静态数据
def showMyVersion(self): # 方法
print(MyClass.myVersion)
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'myVersion', 'showMyVersion']
>>> vars(MyClass)
mappingproxy({'__doc__': 'MyClass class definition', 'myVersion': 1.1, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVersion at 0x00E17198>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__module__': '__main__'})
>>> print(MyClass.__dict__)
{'__doc__': 'MyClass class definition', 'myVersion': 1.1, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVersion at 0x00E17198>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__module__': '__main__'}
5、特殊的类属性
>>> MyClass.__name__ # 类的名字(字符串)
'MyClass'
>>> MyClass.__doc__ # 类的文档字符串
'MyClass class definition'
>>> MyClass.__bases__ # 类的所有父类构成的元组
(<class 'object'>,)
>>> MyClass.__base__ # 类的父类
<class 'object'>
>>> MyClass.__dict__ # 类的属性
mappingproxy({'__doc__': 'MyClass class definition', 'myVersion': 1.1, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVersion at 0x00E17198>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__module__': '__main__'})
>>> MyClass.__module__ # 类定义所在的模块
'__main__'
>>> a = MyClass() # 定义实例
>>> a.__class__ # 实例对应的类
<class '__main__.MyClass'>