Python_020(幾個經典內置方法)
一.內置方法
1.內置方法表示:__名字__
幾種名稱: 1)雙下方法 2)魔術方法 3)類中的特殊方法/內置方法
類中的每一個雙下方法都有它自己的特殊意義;所有的雙下方法沒有 需要你在外部直接調用的
父類Object都帶有這些方法,而總是有一些其他的 內置函數 特殊語法來觸發雙下方法
2.__call__()方法:
class A: def __call__(self, *args, **kwargs): print(‘對象()自動觸發我!‘) a = A() a() #這兩個步驟還可以寫為A()()
1)__call__的一些用法,如果你有兩個類,你只想顯給別人B類,而不暴露A類,可能在實例化A類之前做一些事情
這時候就需要引入另一個類,讓它執行__call__方法
class A: def __call__(self, *args, **kwargs): print(‘執行call方法了‘) class B: def __init__(self,cls): print(‘在實例化A之前做一些事情‘) self.a = cls() #實例化A的對象 self.a() #調用A類中的call方法 print(‘在實例化A之後做一些事情‘) B(A) #只暴露B,不暴露A
2)__len__方法:
a:遇到len(obj)會自動觸發obj的__len__方法
class A: def __init__(self,obj): self.obj = obj def __len__(self): return len(self.obj) a = A(‘wwwwww‘) print(len(a)) #結果為6
3)__str__方法:
a:會自動觸發該方法的幾種情況
1)print一個對象相當於調用一個對象的__str__方法
2)str(obj),相當於執行obj.__str__方法
3)‘%s‘ % obj相當於執行了obj.__str__方法
b:如果類中沒有__str__方法,會自動執行父類的Object的__str__方法,但是只會返回給你一個內存地址,因為它不知道你想要得到什麽屬性;
class A: pass a = A() print(a) #輸出結果: <__main__.A object at 0x0000024F722690F0> #類中含有__str__方法: class A: def __str__(self): return (‘%s, %s, %s‘)% (self.name,self.age,self.cls) def __init__(self,name): self.name = name self.age = 15 self.cls = ‘python‘ a = A(‘zhou‘) print(a) b = A(‘liu‘) print(b) #輸出結果 zhou, 15, python liu, 15, python
c:有什麽用處,特別好用能不用你調用就自動輸出一些你需要顯示的內容;
4)__new__方法:
a:__new__和__init__的千絲萬縷
__new__:開辟內存空間,屬於對象的,把對象的空間作為返回值傳給self,執行init方法; 類的構造方法
__init__:給對象封裝屬性; 類的初始化方法
看他們的執行順序:
class A: def __new__(cls, *args, **kwargs): print(‘執行了__new__方法‘) return object.__new__(cls) def __init__(self): print(‘執行了__init__方法‘) a = A() #執行結果 執行了__new__方法 執行了__init__方法
#所以__new__是在對象實例化之前調用的,還沒有開辟空間傳給self,所以這裏會把cls類的空間傳進來;
new的金典題目單例類:
單例類:在實例化對象後,每個對象的開辟的空間一樣,就是單例類;
class A: _NAME = None def __new__(cls, *args, **kwargs): if not cls._NAME: cls._NAME = object.__new__(cls) return cls._NAME def __init__(self): pass a = A() print(a) b = A() print(b) #輸出結果 <__main__.A object at 0x00000221704E9240> <__main__.A object at 0x00000221704E9240>
Python_020(幾個經典內置方法)