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中没有"真正的"扩展方法机制.
不知道你问的是什么,但你可以扩展现有的类型,然后在新的东西上调用你喜欢的任何东西:
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)
希望澄清你的问题
可以用禁果(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等。
归档时间: |
|
查看次数: |
12220 次 |
最近记录: |