這篇文章主要介紹“Python相關(guān)問題代碼分析”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python相關(guān)問題代碼分析”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)建站長期為上千多家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為五華企業(yè)提供專業(yè)的成都網(wǎng)站設計、做網(wǎng)站,五華網(wǎng)站改版等技術(shù)服務。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
你可能知道 Python 里面的魔法函數(shù),比如 __add__ 和 __sub__ 代表 + - 運算符,表示 obj +/- something,但你可能不知道還有一個 __radd__,__rsub__ 函數(shù),可以表示 something +/- obj。
舉例如下:
class Dog: def __add__(self, other): return "from __add__" def __radd__(self, other): return "from __radd__" dog = Dog() print(dog + 1) # from __add__ print(1 + dog) # from __radd__
__getattr__ 魔術(shù)方法只有在我們試圖獲取不存在的屬性時才會被調(diào)用,__getattribute__ 在每次我們嘗試訪問屬性時都會被調(diào)用。
代碼如下:
class Dog: def __init__(self, name, age): self.name = name self.age = age def __getattr__(self, key): return f"{key} not found" dog = Dog("taidi", 5) print(dog.name)# taidi print(dog.age) # 5 print(dog.breed) # breed not found
class Dog: def __init__(self, name, age): self.name = name self.age = age def __getattribute__(self, key): return f"{key} not found" dog = Dog("taidi", 5) print(dog.name)# name not found print(dog.age) # age not found print(dog.breed) # breed not found
class Animal: def __init__(self, name, age): self.name = name self.age = age class Dog(Animal): def __init__(self, name, age, breed): super().__init__(name, age) self.breed = breed
等價于:
class Animal: def __init__(self, name, age): self.name = name self.age = age class Dog(Animal): def __init__(self, name, age, breed): Animal.__init__(self, name, age) self.breed = breed
請注意,Animal.__init__(self, name, age) 不能少了 self 參數(shù)。
class Animal: pass class Dog(Animal): pass class Cat(Animal): pass class GermanSheperd(Dog): pass print(Animal.__subclasses__()) # [,]
不過,.__subclasses__() 只能檢查直接子類。
class A: def test(self): print("A") class B: def test(self): print("B") class C(A, B): pass C().test() # A
A 和 B 都有 test 方法,那么 C 到底集成了哪一個呢?在 Python 中,最左邊的類優(yōu)先。
在這里,A 是最左邊的父類,因此 A 的 test 方法被集成。
多充繼承讓人困惑,不用為好。
class Dog: def __invert__(self): return "test" dog = Dog() print(~dog) # test
~ 運算符代表“按位非”,通常用于反轉(zhuǎn)內(nèi)容。一個更有意義的例子如下:
class Coordinate: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return f"({self.x}, {self.y})" def __invert__(self): return Coordinate(-self.x, -self.y) a = Coordinate(3, 4) b = ~a print(a, b) # (3, 4) (-3, -4)
def init(self, name, age): self.name = name self.age = age def bark(self): print("woof") Dog = type("Dog", (), {"__init__":init, "bark":bark}) dog = Dog("taidi", 10) print(dog.name) print(dog.age) # taidi # 10
在這里,我們將 3 個參數(shù)傳遞給 type 以創(chuàng)建我們的類。
第一個參數(shù) __name__ 是類的名稱 第二個參數(shù) __bases__ 是一個包含父類的元組 第三個參數(shù) __dict__ 是一個包含屬性和方法的字典。
等價于:
class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print("woof")
關(guān)于“Python相關(guān)問題代碼分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。