在python中建立一個類,它不只有咱們自定義的屬性和方法,還有與生俱來的一些屬性和方法,咱們叫它內建屬性。python
下面是類經常使用內建屬性列表。ruby
經常使用專有屬性 | 說明 | 觸發方式 |
---|---|---|
__init__ |
構造初始化函數 | 建立實例後,賦值時使用,在__new__ 後 |
__new__ |
生成實例所需屬性 | 建立實例時 |
__class__ |
實例所在的類 | 實例.__class__ |
__str__ |
實例字符串表示,可讀性 | print(類實例),如沒實現,使用repr結果 |
__repr__ |
實例字符串表示,準確性 | 類實例 回車 或者 print(repr(類實例)) |
__del__ |
析構 | del刪除實例 |
__dict__ |
實例自定義屬性 | vars(實例.__dict__) |
__doc__ |
類文檔,子類不繼承 | help(類或實例) |
__getattribute__ |
屬性訪問攔截器 | 訪問實例屬性時 |
__bases__ |
類的全部父類構成元素 | 類名.__bases__ |
__init__:負責一個類實例化中的初始化操做app
__new__:在建立實例化時發生做用,在__init__以前執行,主要做用是建立實例對象,典型的應用是在單利模式中.函數
class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): org = super(Singleton, cls) cls._instance = org.__new__(cls, *args, **kw) return cls._instance
__class__:是示例對象的屬性,該屬性指向了實例化該對象的類,表明實例化該對象的抽象類,能夠經過它調用類的方法和類屬性。spa
class Test: name = "抽象類" def __init__(self): self.name = '實例名字' def test(self): print('實例方法') test = Test() test.__class__.name # Out[21]: '抽象類' test.__class__.test(1) # 實例方法
__str__:實例化對象的字符串表示(表明名字),面向用戶,經過print輸出實例化類的結果3d
class Test: def __str__(self): return '這是實例化類的說明書' test = Test() print(test) # 這是實例化類的說明書
__repr__:實例化對象的字符串表示,面向開發者的
code
class Test: def __str__(self): return '用戶可見' def __repr__(self): return '開發者可見' test = Test() print(test) # 用戶可見 test # Out[30]: 開發者可見 在控制檯輸出實例化對象時的顯示信息
__del__:當一個實例化對象被刪除時,該方法將調用,該方法是執行刪除對象的操做。對象
class Test: def __del__(self): print('我被刪除了】') test = Test() del test # 我被刪了
__dict__:類或實例化對象的屬性字典blog
class Test: name = "抽象類" def __init__(self): self.name = '實例名字' def test(self): print('實例方法') test = Test() test.__dict__ Out[51]: {'name': '實例名字'} Test.__dict__ Out[52]: mappingproxy({'__dict__': <attribute '__dict__' of 'Test' objects>, '__doc__': None, '__init__': <function __main__.Test.__init__>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Test' objects>, 'name': '抽象類', 'test': <function __main__.Test.test>})
__doc__:是對函數/方法/模塊所實現功能的簡單描述,但當指向具體對象時,會顯示此對象.繼承
class Test: """我是說明書""" test = Test() test.__doc__ Out[60]: '我是說明書'
__getattribute__:屬性攔截器,內部攔截修改某個屬性的值
class Test: def __init__(self): self.name = '正常名字' def __getattribute__(self, name): return '攔截後名字' test = Test() test.name Out[63]: '攔截後名字'
__bases__:查詢類的父類元素
class A: pass class B: pass class C(A, B): pass C.__bases__ Out[94]: (__main__.A, __main__.B)
內建屬性通常是不建議修改,若是要修改那麼儘可能將整套的內建屬性複寫,不然容易出現錯誤。