Python入門筆記—第十二章【面向對象之OOP(第六部分,類的常用魔術方法)】

類的常用魔術方法

- 魔術方法就是不需要人爲調用的方法,基本是在特定的時刻自動觸發

- 魔術方法的統一特徵,名字前後各有兩個下劃線,如:__init__

- 操作類:

    - __init__:構造函數

    - __new__:對象實例化方法,此函數比較特殊,一般不需要使用

    - __call__:對象當函數使用時觸發

    - __str__:當對象被當做字符串使用的時候調用

    - __repr__:返回字符串,和__str__的具體區別百度?(明天接着研究,感覺水有點深度)

#操作類實例
class A():
    def __init__(self):
        print("我是構造函數")
    def __call__(self):
        print("我是對象,我被當做函數使用時被調用")
    def __str__(self):
        return "我是對象,我被當做字符串使用的時候調用"

a = A()
a()
print(a)

結果:

我是構造函數
我是對象,我被當做函數使用時被調用
我是對象,我被當做字符串使用的時候調用

- 描述符相關:(此部分後面再補)

    - __set__:

    - __get__:

    - __delete__:

- 屬性操作相關:

    - __getattr__:訪問一個不存在的屬性時觸發(代碼實例1:

        - 語法:def __getattr__(self,name)

    - __setattr__:對成員屬性進行設置的時候觸發(代碼實例2:

        - 語法:def __setattr__(self,name,value)

        - 參數:

            - self用來獲取當前對象

            - 被設置的屬性名稱以字符串出現

            - 需要對屬性名稱設置的值

        - 作用:進行屬性設置的時候進行驗證或者修改

        - 注意:在該方法中不能對屬性進行直接賦值操作,否則進入死循

代碼實例1:

#__getattr__案例
class Student():
    name = "dana"
    age = 18

    def __getattr__(self,name):
        print(name)
        print("我是魔法函數__getattar__,當訪問不存在的成員時會調用我,看,我被調用了")

s = Student()
print(s.name)
print(s.age)
print(s.addr)        #此處訪問了類Student中不存在的成員,即自動觸發函數__getattr__
#關於結果中爲什麼會打印出None的解釋:
#魔法函數__getattr_觸發的條件是訪問不存在的成員時會調用,當對象s訪問成員addr時的瞬間就調用了,即:
#打印出name和“我是魔法函數…………”
#然後再使用print打印出s.addr的內容,其內容爲空,即打印出None

結果:

dana
18
addr
我是魔術函數__getattar__,當訪問類中不存在的成員時會調用我,看,我被調用了
None

代碼實例2:

#__setattr__案例
class Student():
    name = "dana"
    age = 18

    def __setattr__(self,name,value):
        #self.name = "xiaona"           #此處如果使用此語句,將會陷入死循環
        print(name+"   "+value)
        print("我是魔法函數__setattar__,當對成員屬性進行設置時會調用我,看,我被調用了")

s = Student()
s.addr = "NCU" 

結果:

addr   NCU
我是魔法函數__setattar__,當對成員屬性進行設置時會調用我,看,我被調用了


- 運算分類相關魔術方法

    - __gt__:進行大於判斷的時候觸發的函數

    - 參數:

        - self

        - 第二個參數是第二個對象

        - 返回值可以是任意只,推薦返回布爾值

代碼實例3:

class Student():
    def __init__(self,name):
        self._name = name

    def __gt__(self,obj):
        print(self._name+"會比"+obj._name+"大嗎?")
        return self._name > obj._name

stu1 = Student("abc")
stu2 = Student("abd")

print(stu1 > stu2)

結果:

abc會比abd大嗎?
False

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章