当前位置:  开发笔记 > 编程语言 > 正文

Python中的扩展方法

如何解决《Python中的扩展方法》经验,为你挑选了3个好方法。

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

MyRandomMethod()

在现有的类型上int

myInt.MyRandomMethod()

Torsten Mare.. 52

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

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


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

>>> A.test = stuff
>>> A().test()

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

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



1> Torsten Mare..:

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

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


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

>>> A.test = stuff
>>> A().test()

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

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


我使用Python的时间越长,它就越好!

2> SilentGhost..:

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

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 "", line 1, in 
    v.xkcd()
AttributeError: 'int' object has no attribute 'xkcd'
c = int(1)
>>> c.random_method()
4
>>> c.xkcd()
42

希望澄清你的问题


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

3> Rustam Ganey..:

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

安装禁果:

pip install forbiddenfruit

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

>>> from forbiddenfruit import curse

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

>>> curse(float, 'percent', percent)
>>> 1.0.percent(5)
1.05

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

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有