Python 魔术方法.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 魔术方法.相关的知识,希望对你有一定的参考价值。
‘123‘ + ‘456‘ ‘123‘.__add__.‘456‘
Python 中,这两个语句是等价的。具体的说,第二句是第一句的具体实现。当处理‘+’的时候,Python 会去‘+’号的左侧的object寻找是否有__add__的魔术方法。如果这个object有__add__的具体实现, 那么这个object就支持加法的操作。 ‘123’是字符串,也是str类型的object,那么我们推测它肯定有__add__方法:
>>> type(‘123‘) <type ‘str‘> >>> dir(‘123‘) [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘_
个人感觉Python的魔术方法是一种比较漂亮的方法,如果想要支持某种内置的操作,只要去实现对应的方法即可。
很显然,下面的代码会报错。
class MyObject(object): def __init__(self, name): self.name = name my_object1 = MyObject(‘Hello‘) my_object2 = MyObject(‘World‘) my_object1 + my_object2
Output:
my_object1 + my_object2 TypeError: unsupported operand type(s) for +: ‘MyObject‘ and ‘MyObject‘
实现了__add__魔术方法之后呢?
class MyObject(object): def __init__(self, name): self.name = name def __add__(self, other): return self.name + other.name my_object1 = MyObject(‘Hello‘) my_object2 = MyObject(‘World‘) print(my_object1 + my_object2)
Output:
HelloWorld
如果一个object是class, 那么使用dir(object) 命令,就能发现它有__class__的method。
如果一个object支持str(object)的操作,那么它就有具体__str__的实现。
如果一个object支持len(object)的操作,那么它就有具体__str__的实现。
以上是关于Python 魔术方法.的主要内容,如果未能解决你的问题,请参考以下文章
PHP链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function