1. 程式人生 > >Python_020(幾個經典內置方法)

Python_020(幾個經典內置方法)

cls -s family pri 自動 如果 一個 war __init__

一.內置方法

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(幾個經典內置方法)