摘要:魔法方法基礎如果你想所以你寫調用初始化一個實例作為一個字符串的官方表示作為一個字符串作為字節數組作為格式化字符串方法在創建實例后調用如果你想控制創建過程請使用方法按照慣例應該返回一個有效的表達式的字符串方法也被稱為你的迭代相關如果你想所以你
Python 魔法方法 基礎:
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
初始化一個實例 | x = MyClass() | x.__init__() |
作為一個字符串的"官方"表示 | repr(x) | x.__repr__() |
作為一個字符串 | str(x) | x.__str__() |
作為字節數組 | bytes(x) | x.__bytes__() |
作為格式化字符串 | format(x, format_spec) | x.__format__(format_spec) |
__init__()方法在創建實例后調用.如果你想控制創建過程,請使用__new__()方法
按照慣例, __repr__() 應該返回一個有效的Python表達式的字符串
__str__()方法也被稱為你的print(x)
迭代相關如果你想... | 所以,你寫... | Python調用... |
---|---|---|
遍歷一個序列 | iter(seq) | seq.__iter__() |
從迭代器中獲取下一個值 | next(seq) | seq.__next__() |
以相反的順序創建一個迭代器 | reversed(seq) | seq.__reversed__() |
__iter__()無論何時創建新的迭代器,都會調用該方法.
__next__()每當你從迭代器中檢索一下個值的時候,都會調用該方法
__reversed__()方法并不常見.它需要一個現有序列并返回一個迭代器,該序列是倒序的順序.
屬性如果你想... | 所以,你寫... | Python調用... |
---|---|---|
得到一個屬性 | x.my_property | x.__getattribute__("my_property") |
獲得一個屬性 | x.my_property | x.__getattr__("my_property") |
設置一個屬性 | x.my_property = value | x.__setattr__("my_property", value) |
闡述一個屬性 | del x.my_property | x.__delattr__("my_property") |
列出所有屬性和方法 | dir(x) | x.__dir__() |
如果你的類定義了一個__getattribute__()方法,Python將在每次引用任何屬性或方法名時調用它.
如果你的類定義了一個__getattr__()方法,Python只會在所有普通地方查找屬性后調用它.如果一個實例x定義了一個屬性 color, x.color將不會調用x.__getattr__("color"); 它將簡單地返回已經定義的x.color值.
__setattr__()只要你為屬性指定值,就會調用該方法.
__delattr__()只要刪除屬性,就會調用該方法.
__dir__()如果您定義一個__getattr__() 或者 __getattribute__() 方法,該方法很有用.通常情況下,調用dir(x)只會列出常規屬性和方法.
__getattr__()和__getattribute__()方法之間的區別很微妙但很重要.
函數類通過定義__call__()方法,您可以創建一個可調用類的實例 - 就像函數可調用一樣.
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
來"調用"像函數一樣的實例 | my_instance() | my_instance.__call__() |
如果你的類作為一組值的容器 - 也就是說,如果問你的類是否"包含"一個值是有意義的 - 那么它應該定義下面的特殊方法,使它像一個集合一樣.
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
序列的數量 | len(s) | s.__len__() |
否包含特定的值 | x in s | s.__contains__(s) |
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
通過它的key來獲得值 | x[key] | x.__getitem__(key) |
通過它的key來設置一個值 | x[key] = value | x.__setitem__(key, value) |
刪除鍵值對 | del x[key] | x.__delitem__(key) |
為丟失的key提供默認值 | x[nonexistent_key] | x.__missing__(nonexistent_key) |
如果你想... | 所以,你寫... | Python調用... | |
---|---|---|---|
加 | x + y | x.__add__(y) | |
減 | x - y | x.__sub__(y) | |
乘 | x * y | x.__mul__(y) | |
整除 | x / y | x.__trueiv__(y) | |
除 | x // y | x.__floordiv__(v) | |
取余 | x % y | x.__mod__(y) | |
整除與取余 | divmod(x, y) | x.__divmod__(y) | |
平方 | x ** y | x.__pow__(y) | |
左移 | x << y | x.__lshift__(y) | |
友移 | x >> y | x.__rshift__(y) | |
按位and運算 | x & y | x.__and__(y) | |
按位xor或運算 | x ^ y | x.__xor__(y) | |
按位or運算 | `x | y` | x.__or__(y) |
上述一組特殊方法采用第一種方法:給定x / y,它們提供了一種方法讓x說"我知道如何用y整除自己".以下一組特殊方法解決了第二種方法:它們為y提供了一種方法來說"我知道如何成為分母,并將自己整除x".
如果你想... | 所以,你寫... | Python調用... | |
---|---|---|---|
加 | x + y | x.__radd__(y) | |
減 | x - y | x.__rsub__(y) | |
乘 | x * y | x.__rmul__(y) | |
整除 | x / y | x.__rtrueiv__(y) | |
除 | x // y | x.__rfloordiv__(v) | |
取余 | x % y | x.__rmod__(y) | |
整除與取余 | divmod(x, y) | x.__rdivmod__(y) | |
平方 | x ** y | x.__rpow__(y) | |
左移 | x << y | x.__rlshift__(y) | |
友移 | x >> y | x.__rrshift__(y) | |
按位and運算 | x & y | x.__rand__(y) | |
按位xor或運算 | x ^ y | x.__rxor__(y) | |
按位or運算 | `x | y` | x.__ror__(y) |
可是等等!還有更多!如果你正在進行"就地"操作,如x /= 3則可以定義更多特殊的方法.
如果你想... | 所以,你寫... | Python調用... | |
---|---|---|---|
加 | x + y | x.__iadd__(y) | |
減 | x - y | x.__isub__(y) | |
乘 | x * y | x.__imul__(y) | |
整除 | x / y | x.__itrueiv__(y) | |
除 | x // y | x.__ifloordiv__(v) | |
取余 | x % y | x.__imod__(y) | |
整除與取余 | divmod(x, y) | x.__idivmod__(y) | |
平方 | x ** y | x.__ipow__(y) | |
左移 | x << y | x.__ilshift__(y) | |
友移 | x >> y | x.__irshift__(y) | |
按位and運算 | x & y | x.__iand__(y) | |
按位xor或運算 | x ^ y | x.__ixor__(y) | |
按位or運算 | `x | y` | x.__ior__(y) |
還有一些"單個數"數學運算可以讓你自己對類似數字的對象進行數學運算.
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
負數 | -x | x.__neg__() |
正數 | +x | x.__pos__() |
絕對值 | abs(x) | x.__abs__() |
逆 | ~x | x.__invert__() |
復數 | complex(x) | x.__complex__() |
整數 | int(x) | x.__int__() |
浮點數 | float(x) | x.__float__() |
四舍五入到最近的整數 | round(x) | x.__round__() |
四舍五入到最近的n位數 | round(x, n) | x.__round__(n) |
最小整數 | math.ceil(x) | x.__ceil__() |
最大整數 | math.floor(x) | x.__floor__() |
截斷x到0的最接近的整數 | math.trunc(x) | x.__trunc__() |
數字作為列表索引 | a_list[x] | a_list[x.__index__()] |
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
等于 | x == y | x.__eq__(y) |
不等于 | x != y | x.__ne__(y) |
小于 | x < y | x.__lt__(y) |
小于等于 | x <= y | x.__le__(y) |
大于 | x > y | x.__gt__(y) |
大于等于 | x >= y | x.__ge__(y) |
布爾 | if x: | x.__bool__() |
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
對象副本 | copy.copy(x) | x.__copy__() |
深拷貝 | copy.deepcopy(x) | x.__deepcopy__() |
序列化一個對象 | pickle.dump(x, file) | x.__getstate__() |
序列化一個對象 | pickle.dump(x, file) | x.__reduce__() |
序列化一個對象 | pickle.dump(x, file, protocol_version) | x.__reduce_ex__(protocol_version) |
取出恢復后的狀態 | x = pickle.load(fp) | x.__getnewargs__() |
取出恢復后的狀態 | x = pickle.load(fp) | x.__setstate__() |
with塊限定了運行時上下文;在執行with語句時,"進入"上下文,并在執行塊中的最后一個語句后"退出"上下文.
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
進入with語句塊 | with x: | x.__enter__() |
退出with語句塊 | with x: | x.__exit__(exc_type, exc_value, traceback) |
如果你想... | 所以,你寫... | Python調用... |
---|---|---|
x = MyClass() | x.__new__() | |
del x | x.__del__() | |
`` | x.__solts__() | |
hash(x) | x.__hash__() | |
x.color | type(x).__dict__["color"].__get__(x, type(x)) | |
x.color = "PapayaWhip" | type(x).__dict__["color"].__set__(x, "PapayaWhip") | |
del x.color | type(x).__dict__["color"].__del__(x) | |
isinstance(x, MyClass) | MyClass.__instancecheck__(x) | |
isinstance(C, MyClass) | MyClass.__subclasscheck__(C) | |
isinstance(C, MyABC) | MyABC.__subclasshook__(C) |
Python正確調用__del__()特殊方法時非常復雜.為了完全理解它,你需要知道Python如何跟蹤內存中的對象.這里有一篇關于Python垃圾收集和類析構函數的好文章.你還應該閱讀關于弱引用,weakref模塊,以及可能的gc模塊以獲得更好的度量.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41785.html
摘要:幸而,提供了造物主的接口這便是,或者稱為元類。接下來我們將通過一個栗子感受的黑魔法,不過在此之前,我們要先了解一個語法糖。此外,在一些小型的庫中,也有元類的身影。 首發于 我的博客 轉載請注明出處 接觸過 Django 的同學都應該十分熟悉它的 ORM 系統。對于 python 新手而言,這是一項幾乎可以被稱作黑科技的特性:只要你在models.py中隨便定義一個Model的子類,Dj...
摘要:我可以明確告訴你這不是,但它可以用解釋器運行。這種黑魔法,還要從說起。提案者設想使用一種特殊的文件首注釋,用于指定代碼的編碼。暴露了一個函數,用于注冊自定義編碼。所謂的黑魔法其實并不神秘,照貓畫虎定義好相應的接口即可。 首發于我的博客,轉載請注明出處 寫在前面 本文為科普文 本文中的例子在 Ubuntu 14.04 / Python 2.7.11 下運行成功,Python 3+ 的接...
摘要:據說,的對象天生擁有一些神奇的方法,它們總被雙下劃線所包圍,他們是面向對象的的一切。的魔術方法非常強大,然而隨之而來的則是責任。 據說,Python 的對象天生擁有一些神奇的方法,它們總被雙下劃線所包圍,他們是面向對象的 Python 的一切。 他們是可以給你的類增加魔力的特殊方法,如果你的對象實現(重載)了這些方法中的某一個,那么這個方法就會在特殊的情況下被 Python 所調用,你...
摘要:,指定并發導出或導入線程數。默認線程數,默認線程數是個數。注線程數不是越大越好,這里主要的衡量指標是網絡帶寬磁盤目標庫,最好用觀察一下。 1. 簡介 取名mypumpkin,是python封裝的一個讓mysqldump以多線程的方式導出庫表,再以mysql命令多線程導入新庫,用于成倍加快導出,特別是導入的速度。這一切只需要在 mysqldump 或 mysql 命令前面加上 mypum...
摘要:類的繼承類繼承有三種調用方式,其實是有區別的,聽我慢慢道來第一種父類方法參數直接調用第二種方法參數直接調用在誰的類下調用,就找此類對應的下一個就是要繼承的第三種方法參數找類名對應的的下一個,就是繼承的,一般寫本身的類名上下文管理器上下文管理 類的繼承 類繼承有三種調用方式,其實是 有區別 的,聽我慢慢道來 class A: def say(self, name): ...
閱讀 2924·2021-11-23 09:51
閱讀 3099·2021-11-15 11:39
閱讀 2979·2021-11-09 09:47
閱讀 2527·2019-08-30 13:49
閱讀 2113·2019-08-30 13:09
閱讀 3092·2019-08-29 16:10
閱讀 3504·2019-08-26 17:04
閱讀 984·2019-08-26 13:57