Python魔法

__call__(self,[,args...]) :允許實例像函數一樣執行

class Student():
    __number = 100
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __call__(self,name,age):
        print(name,age)
studentA = Student('Jack',18)
studentA("hello","world")  # studentA.__call__("hello","world")

__len__(self):實例對象被len()函數調用時,執行此函數

class Student():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __len__(self):
        print('訪問實例對象的長度')
        return 100
studentA = Student('Jack',18)
print(len(studentA))

# 訪問實例對象的長度
# 100

__getattr__(self,attr): 訪問實例的屬性不存在時,執行此函數,並將函數返回結果作爲不存在屬性的值

class Student():
    __number = 100
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __getattr__(self,attr):
        print(attr + "不存在")
        return '不能確定性別'
studentA = Student('Jack',18)
print(studentA.sex)
print(studentA.name)


# sex不存在
# 不能確定性別
# Jack

__getattribute__(self,attr):訪問實例的屬性時,不管實例的屬性是否存在,都會執行該函數,函數的返回值就是屬性的值

__getattribute__()執行,就不會執行__getattr__(self,attr)

class Student():
    __number = 100
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __getattr__(self,attr):
        print(attr + "不存在")
        return '不能確定性別'
    def __getattribute__(self,attr):
        print('正在訪問實例的'+ attr)
        return 'man'
studentA = Student('Jack',18)
print(studentA.sex)
print(studentA.name)

# 正在訪問實例的sex
# man
# 正在訪問實例的name
# man

__setattr__(self,attr,value): 給實例的屬性賦值的動作,就是執行該函數

class Student():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __setattr__(self,attr,value):
        print(attr,value)
        return 100
    def __getattr__(self,attr):
        print(attr + '屬性不存在')
studentA = Student('Jack',18)
studentA.score = 90    # 等價於 studentA.__setattr__(self,'score',90)
print(studentA.name)

# name Jack
# age 18
# score 90
# name屬性不存在
# None

 

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