02-魔法函式
阿新 • • 發佈:2019-11-30
一、魔法函式
1.1、什麼是魔法函式
魔法函式就是以雙下劃線開頭,雙下劃線結尾。第二點就是必須使用Python提供給我們的魔法函式。魔法函式是與自定義的類有關的,目的是為了增強自定義類的特性。
class Students(object): def __init__(self,student_list): #初始化屬性 self.student = student_list def __getitem__(self, item): #傳入索引,從零開始,如果沒有值了就停止執行。如果將此魔法方法註釋掉會報錯TypeError: 'Students' object is not iterable return self.student[item] #增加此魔法方法給類增加了可迭代的屬性 students = Students(["lishuntao","wang","li"]) for student in students: print(student,end=" ") #lishuntao wang li
1.2、Python的資料模型以及資料模型對Python的影響
要成為一名高階的開發工程師,就需要對Python的內部原始碼做一定的理解,這樣當自己定義類的時候,才會更加靈活的定義。例如下面這個例子:
class Students(object): def __init__(self,student_list): self.student = student_list def __getitem__(self, item): return self.student[item] def __len__(self): return len(self.student) #這裡一定要返回的是正整數 students = Students(["lishuntao","wang","li"]) print(len(students)) #當註釋掉len魔法方法執行出現錯誤TypeError: object of type 'Students' has no len() #當有len魔法函式的時候,執行出現值3
1.3、魔法函式一覽
1.3.1、非數學運算
字串表示:
__repr__ #在開發環境下呼叫,例如python直譯器下,以及jupyter notebook下呼叫返回物件的地址(開發人員才用到的) __str__ #對我們的物件進行字串格式化的時候進行呼叫
集合序列相關:
__len__ __getitem__ __setitem__ __delitem__ __contains__
迭代相關:
__iter__ __next__
可呼叫:
__call__
with上下文管理器:
__enter__ __exit__
數值轉換:
__abs__ __bool__ __int__ __float__ __hash__ __index__
元類相關:
__new__ __init__
屬性相關:
__getattr__、__setattr__ __getattribute__、__setattribute__ __dir__
屬性描述符:
__get__、__set__、__delete__
協程:
__await__、__aiter__、__anext__、__aenter__、__aexit__
1.3.2、數學運算
一元運算子:
__neg__(-)、__pos__(+)、__abs__
二元運算子:
__lt__(<)、__le__(<=)、__eq__(==)、__ne__(!=)、__gt__(>)、__ge__(>=)
算術運算子:
__add__(+)、__sub__(-)、__mul__(*)、__truediv__(/)、__floordiv(//)、__mod__(%)、__divmod__(divmod())、__pow__(**或pow())、__round__(round())
反向算數運算子:
__radd__、__rsub__、__rmul__、__rtruediv__、__rfloordiv、__rmod__、__rdivmod__、__rpow__、
增量賦值算數運算子:
__iadd__、__isub__、__imul__、__itruediv__、__ifloordiv、__imod__、__ipow__
位運算子:
__invert__(~)、__lshift__(<<)、__rshift__(>>)、__and__(&)、__or__(|)、__xor__(^)
反向位運算子:
__rlshift__、__rrshift__、__rand__、__ror__、__rxor__
增量賦值算數運算子:
__ilshift__、__irshift__、__iand__、__ior__、__ixor__
1.4、魔法函式的重要性(len())
在使用python的len函式的時候,儘量去使用python原生的型別(list、set、dict),這些型別效能很高.Cpython是用C語言寫出來的,因此效率很高。再用python語法去寫的話,效率會大大下降。因為魔法函式內部會做很多優化,大大提升效