Python中的扩展方法

Joa*_*nge 41 python extension-methods function

Python有像C#这样的扩展方法吗?是否可以调用如下方法:

MyRandomMethod()
Run Code Online (Sandbox Code Playgroud)

在现有的类型上int

myInt.MyRandomMethod()
Run Code Online (Sandbox Code Playgroud)

Tor*_*rek 52

您可以在Python代码中定义的类对象上添加您喜欢的任何方法(AKA monkey patching):

>>> class A(object):
>>>     pass


>>> def stuff(self):
>>>     print self

>>> A.test = stuff
>>> A().test()
Run Code Online (Sandbox Code Playgroud)

这对内置类型不起作用,因为它们__dict__不可写(它是a dictproxy).

所以不,Python中没有"真正的"扩展方法机制.

  • 我使用Python的时间越长,它就越好! (8认同)

Sil*_*ost 9

不知道你问的是什么,但你可以扩展现有的类型,然后在新的东西上调用你喜欢的任何东西:

class  int(int):
     def random_method(self):
           return 4                     # guaranteed to be random
v = int(5)                              # you'll have to instantiate all you variables like this
v.random_method()

class int(int):
    def xkcd(self):
        import antigravity
        print(42)

>>>v.xkcd()
Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    v.xkcd()
AttributeError: 'int' object has no attribute 'xkcd'
c = int(1)
>>> c.random_method()
4
>>> c.xkcd()
42
Run Code Online (Sandbox Code Playgroud)

希望澄清你的问题

  • 注意:在真正的Python代码中,这几乎总是一件坏事.与C#中的扩展方法不同,这里你实际上是让变量"int"引用一个完全不同的(继承的)类,它违反了最小意外的原则(即突然isinstance(5,int)是假的 - WTF?) (7认同)
  • 不错的XKCD参考. (3认同)

Rus*_*yev 5

可以用禁果(https://pypi.python.org/pypi/forbiddenfruit)完成

安装禁果:

pip install forbiddenfruit
Run Code Online (Sandbox Code Playgroud)

然后,您可以扩展内置类型:

>>> from forbiddenfruit import curse

>>> def percent(self, delta):
...     return self * (1 + delta / 100)

>>> curse(float, 'percent', percent)
>>> 1.0.percent(5)
1.05
Run Code Online (Sandbox Code Playgroud)

Forbidden Fruit从根本上依赖C API,它仅适用于cpython实现,而不适用于其他python实现,例如Jython,pypy等。