1. 程式人生 > >02-魔法函式

02-魔法函式

一、魔法函式

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語法去寫的話,效率會大大下降。因為魔法函式內部會做很多優化,大大提升效