Python 看書的一些記錄 運算子過載
阿新 • • 發佈:2018-11-06
1.類和模組有什麼關係?
(1)類是模組的一部分,是模組物件的屬性。
(2)類和模組都是名稱空間,但是類是對於語法的。模組是對於檔案的
(3)類支援多個例項,但是模組被匯入時只有一個。
2.什麼是抽象超類(抽象基類)?
抽象超類就是指類的部分行為需要由其子類提供
class Person(object): """docstring for Person""" def __init__(self,name): self.name = name def test_func(self): self.action() # 實現action方法需要在子類中定義進行呼叫class Teacher(Person): """docstring for Teacher""" def action(self): print(self.name) if __name__ =="__main__": teacher = Teacher("sunqi") teacher.test_func()
3.Python中的迭代環境都會先嚐試呼叫__iter__方法,如果沒有才會呼叫__getitem__方法進行索引取值。
- 每次進行迭代,都會嘗試用物件的iter內建函式去呼叫__iter__方法,返回一個迭代器物件,然後不斷呼叫返回物件的next方法,
直到發生StopIteration異常
- 若沒有__iter__方法,就會呼叫__getitem__方法,不斷索引取值,直到發生IndexError異常。
4.類中的__getattr__與__setattr__
__getattr__ 會在類中查詢屬性時呼叫。
__setattr__ 會在設定屬性時呼叫
__getattribute__會在查詢屬性時呼叫(無論屬性是否存在)
class Test(object): def __init__(self,data): self.data = data def __getattribute__(self,attrname): print("__getattribute__") return object.__getattribute__(self,attrname) def __getattr__(self,attrname): print("__getattr__") if attrname == "age": return 40 else : return AttributeError def __setattr__(self,attrname,value): print("__setattr__") self.__dict__[attrname] = value # self.__setattr__(attrname,value) if __name__ == "__main__": t = Test("test") print(t.data) print("*" * 10) print(t.age) print("*" * 10) print(t.name) t.name = "sunqi"
__setattr__
__getattribute__
__getattribute__
test
**********
__getattribute__
__getattr__
40
**********
__getattribute__
__getattr__
<class 'AttributeError'>
__setattr__
__getattribute__
5.右側加法和原處加法__radd__ , __iadd__
當加號右側是類例項,左側不是類例項才會呼叫__radd__,其他情況都會由左側物件呼叫__add__方法(瞭解一下)
__iadd__ 實現了+=功能