Есть ли у Python методы расширения, такие как С#? Можно ли вызвать такой метод, как:
MyRandomMethod()
для существующих типов, таких как int
?
myInt.MyRandomMethod()
Есть ли у Python методы расширения, такие как С#? Можно ли вызвать такой метод, как:
MyRandomMethod()
для существующих типов, таких как int
?
myInt.MyRandomMethod()
Вы можете добавить любые методы, которые вам нравятся, для объектов класса, определенных в коде Python (исправление обезьяны AKA):
>>> class A(object):
>>> pass
>>> def stuff(self):
>>> print self
>>> A.test = stuff
>>> A().test()
Это не работает со встроенными типами, потому что их __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
надеюсь, что уточнит ваш вопрос
Это можно сделать с помощью Forbidden Fruit (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 и т.д.
Мне повезло с описанным здесь методом:
http://mail.python.org/pipermail/python-dev/2008-January/076194.html
Я понятия не имею, работает ли это на встроенных серверах.
Другой вариант - переопределить метаклассу. Это позволяет, помимо прочего, указать функции, которые должны существовать во всех классах.
В этой статье обсуждается:
http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html