1. 程式人生 > >Python 看書的一些記錄 運算子過載

Python 看書的一些記錄 運算子過載

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__ 實現了+=功能