Class 有一些特殊的屬性,便於我們獲得一些額外的資訊。
>>> class Class1(object): """Class1 Doc.""" def __init__(self): self.i = 1234>>> Class1.__doc__ # 類型協助資訊'Class1 Doc.'>>> Class1.__name__ # 類型名稱'Class1'>>> Class1.__module__ # 類型所在模組'__main__'>>> Class1.__bases__ # 類型所繼承的基類(<type 'object'>,)>>> Class1.__dict__ # 類型字典,儲存所有類型成員資訊。<dictproxy object at 0x00D3AD70>>>> Class1().__class__ # 類型<class '__main__.Class1'>>>> Class1().__module__ # 執行個體類型所在模組'__main__'>>> Class1().__dict__ # 對象字典,儲存所有執行個體成員資訊。{'i': 1234}
成員
Python Class 同樣包含類型和執行個體兩種成員。
>>> class Class1: i = 123 # Class Field def __init__(self): self.i = 12345 # Instance Field >>> print Class1.i123>>> print Class1().i12345
兩個比較重要的取執行個體屬性的函數:
getattr(執行個體,屬性名稱),hasattr(執行個體,屬性名稱)判斷屬性名稱是否屬於執行個體。
如上例:s='i',getattr(Class1(),s)=12345
hasattr(Class1(),s)=True
-----------------------
有幾個很 "特殊" 的 "規則" 需要注意。
(1) 我們可以通過執行個體引用訪問類型成員。因此下面的例子中 self.i 實際指向 Class1.i,直到我們為執行個體新增了一個成員 i。
>>> class Class1: i = 123 def __init__(self): print self.i print hex(id(self.i))>>> hex(id(Class1.i)) # 顯示 Class1.i'0xab57a0'>>> a = Class1() # 建立 Class1 執行個體,我們會發現 self.i 實際指向 Class1.i。1230xab57a0>>> Class1.__dict__ # 顯示 Class1 成員{'i': 123, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x00D39470>}>>> a.__dict__ # 顯示執行個體成員{}>>> a.i = 123456789 # 為執行個體新增一個成員 i>>> hex(id(a.i)) # 顯示新增執行個體成員地址'0xbbb674'>>> a.__dict__ # 顯示執行個體成員{'i': 123456789}
我們可以在成員名稱前添加 "__" 使其成為私人成員。
>>> class Class1: __i = 123 def __init__(self): self.__x = 0 def __test(self): print id(self)
事實上這隻是一種規則,並不是編譯器上的限制。我們依然可以用特殊的文法來訪問私人成員。
>>> Class1._Class1__i123>>> a = Class1()>>> a._Class1__x0>>> a._Class1__test()13860376
-----------------------
除了靜態(類型)欄位,我們還可以定義靜態方法。
>>> class Class1: @staticmethod def test(): print "static method">>> Class1.test()static method
重載
Python 支援一些特殊方法和運算子多載。
>>> class Class1: def __init__(self): self.i = 0 def __str__(self): return "id=%i" % id(self) def __add__(self, other): return self.i + other.i>>> a = Class1()>>> a.i = 10>>> str(a)'id=13876120'>>> b = Class1()>>> b.i = 20>>> a + b30
通過重載 "__eq__",我們可以改變 "==" 運算子的行為。
>>> class Class1: pass>>> a = Class1()>>> b = Class1()>>> a == bFalse>>> class Class1: def __eq__(self, x): return 55>>> a = Class1()>>> b = Class1()>>> a == b55