>>> class a(object): pass >>> o=a() >>> dir(o) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] >>> o.__class__#對象的類屬性指向類對象 <class '__main__.a'> >>> type(o.__class__) <type 'type'> >>> o.__class__.name
python中一切皆對象,實例通過類屬性就可以調用類的方法。
類方法 @classmethod修飾方式
class A(object): def foo(self, x): print("executing foo(%s,%s)" % (self, x)) print('self:', self) @classmethod def class_foo(cls, x): print("executing class_foo(%s,%s)" % (cls, x)) print('cls:', cls) @staticmethod def static_foo(x): print("executing static_foo(%s)" % x) a = A()
普通的類方法foo()需要通過self參數隱式的傳遞當前類對象的實例。 @classmethod修飾的方法class_foo()需要通過cls參數傳遞當前類對象。@staticmethod修飾的方法定義與普通函數是一樣的。
self和cls的區別不是強制的,只是PEP8中一種編程風格,slef通常用作實例方法的第一參數,cls通常用作類方法的第一參數。即通常用self來傳遞當前類對象的實例,cls傳遞當前類對象。