Python高級語法:魔法函數


介紹的魔法函數有(持續更新): __ init__()、__ str__()、__ new__()、__ unicode__()、 __ call__()、 __ len__()、 __repr__()、__ setattr__()、 __ getattr__()、 __ getattribute__()、 __ delattr__()、__ setitem__()、 __ getitem__()、__ delitem__()、 __ iter__()、__ del__()、 __dir__()、__dict__()、__exit__(),__enter(), __all__()等函數。

1. 前言

1.1 什么是魔法函數?

魔法函數一覽

所謂魔法函數(Magic Methods),是Python的一種高級語法,允許你在類中自定義函數(函數名格式一般為__xx__),並綁定到類的特殊方法中。比如在類A中自定義__str__()函數,則在調用str(A())時,會自動調用__str__()函數,並返回相應的結果。在我們平時的使用中,可能經常使用__init__函數(構造函數)和__del__函數(析構函數),其實這也是魔法函數的一種。

  • Python中以雙下划線(__xx__)開始和結束的函數(不可自己定義)為魔法函數。
  • 調用類實例化的對象的方法時自動調用魔法函數。
  • 在自己定義的類中,可以實現之前的內置函數。

1.2 魔法函數有什么作用?

魔法函數可以為你寫的類增加一些額外功能,方便使用者理解。舉個簡單的例子,我們定義一個“人”的類People,當中有屬性姓名name、年齡age。讓你需要利用sorted函數對一個People的數組進行排序,排序規則是按照name和age同時排序,即name不同時比較name,相同時比較age。由於People類本身不具有比較功能,所以需要自定義,你可以這么定義People類:

class People(object): def __init__(self, name, age): self.name = name self.age = age return def __str__(self): return self.name + ":" + str(self.age) def __lt__(self, other): return self.name < other.name if self.name != other.name else self.age < other.age if __name__=="__main__": print("\t".join([str(item) for item in sorted([People("abc", 18), People("abe", 19), People("abe", 12), People("abc", 17)])]))

輸出結果:

abc:17 abc:18 abe:12 abe:19

上個例子中的__lt__函數即less than函數,即當比較兩個People實例時自動調用。

2. 常見的魔法函數

我們將魔法方法分為:非數學運算和數學運算兩大類。

2.1 非數學運算

2.1.1 字符串表示

__repr__函數和__str__函數:

初識CV:字符串表示:__repr__函數和__str__函數:​zhuanlan.zhihu.com

2.1.2 集合、序列相關

__len__函數、__getitem__函數、__setitem__函數、__delitem__函數和__contains__函數:

初識CV:集合、序列相關:__len__函數、__getitem__函數、__setitem__函數、__delitem__函數和__contains__函數​zhuanlan.zhihu.com

2.1.3 迭代相關

__iter__函數和__next__函數:

初識CV:迭代相關:__iter__函數和__next__函數​zhuanlan.zhihu.com

2.1.4 可調用

__call__函數:

初識CV:可調用:__call__函數​zhuanlan.zhihu.com

2.1.5 with上下文管理器

__enter__函數和__exit__函數:

初識CV:with上下文管理器:__enter__函數和__exit__函數​zhuanlan.zhihu.com

2.1.6 數值轉換

__abs__函數、__bool__函數、__int__函數、__float__函數、__hash__函數和__index__函數:

2.1.7 元類相關

__new__函數和__init__函數:

初識CV:元類相關:__new__函數和__init__函數​zhuanlan.zhihu.com

2.1.8 屬性相關

__getattr__函數、__setattr__函數、__getattribute__函數、__setattribute__函數和__dir__函數:

初識CV:屬性相關:__getattr__函數、__setattr__函數、__getattribute__函數、__setattribute__函數和__dir__函數:​zhuanlan.zhihu.com

2.1.9 屬性描述符

__get__函數、__set__函數和__delete_函數:

初識CV:屬性描述符:__get__函數、__set__函數和__delete_函數​zhuanlan.zhihu.com

 

2.1.10 協程

__await__函數、__aiter__函數、__anext__函數、__aenter__函數和__aexit__函數

2.2 數學運算

2.2.1 一元運算符

__neg__ (-)、__pos__ (+)和__abs__函數。

2.2.2 二元運算符

__lt__ (<)、__le__ (<=)、__eq__ (==)、__ne__ (!=)、__gt__ (>)和__ge__ (>=)。

2.2.3 算術運算符

__add__ (+)、__sub__ (-)、__mul__ (*)、__truediv__ (/)、__floordiv__ (//)、__mod__ (%)、__divmod__ 或divmod()、__pow__ 或pow() (**)和__round__ 或round()。

2.2.4 反向算術運算符

__radd__、__rsub__、__rmul__、__rtruediv__、__rfloordiv__、__rmod__、__rdivmod__和__rpow__。

2.2.5 增量賦值算術運算符

__iadd__、__isub__、__imul__、__ifloordiv__和__ipow__。

2.2.6 位運算符

__invert__ (~)、__lshift__ (<<)、__rshift__ (>>)、__and__ (&)、__or__ (|)和__xor__ (^)。

2.2.7 反向位運算符

__rlshift__、__rrshift__、__iand__、__ixor__和__ior__。

2.2.8 增量賦值運算符

__ilshift__、__irshift__、__iand__、__ixor__和__ior__。

2.3 其他魔法函數

__ unicode__()函數,__ delattr__()函數, __ del__()函數, __dict__()函數,__all__()函數:

初識CV:其他魔法函數:__ unicode__(),__ delattr__(), __ del__(), __dict__(),__all__()​zhuanlan.zhihu.com

[1][2][3][4]

 

參考

  1. ^Python類特殊成員(屬性和方法) http://c.biancheng.net/view/2367.html
  2. ^Python中內建屬性__getattribute__的用法總結 https://blog.csdn.net/yitiaodashu/article/details/78974596
  3. ^Python3基礎 __delattr__ 在一個屬性被刪除時的行為 https://www.cnblogs.com/xingchuxin/p/10425683.html
  4. ^Python __exit__,__enter__函數with語句的組合應用 http://blog.sina.com.cn/s/blog_13cc013b50102wvp1.html
編輯於 05-29
原文鏈接:https://zhuanlan.zhihu.com/p/344951719


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM