Имеет ли Python методы расширения, такие как C#? Можно ли вызвать метод, как:Методы расширения в Python
MyRandomMethod()
на существующих типов, как int
?
myInt.MyRandomMethod()
Имеет ли Python методы расширения, такие как C#? Можно ли вызвать метод, как:Методы расширения в Python
MyRandomMethod()
на существующих типов, как int
?
myInt.MyRandomMethod()
вас могут добавлять любые методы, которые вам нравятся, в объектах класса, определенных в коде Python (патч-апк AKA):
>>> class A(object):
>>> pass
>>> def stuff(self):
>>> print self
>>> A.test = stuff
>>> A().test()
Это не работает на встроенных типах, потому что их __dict__
не доступен для записи (это dictproxy
).
Нет, нет никакого «реального» механизма расширения в Python.
Чем дольше я использую 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
надежде, что проясняет ваш вопрос
Но я имею в виду вызов непосредственно из существующих типов, а не из MyInt, но int. Так же, как v = 5; v.RandomMethod(); –
вы можете вызвать класс int (int), но вам нужно будет создать переменную типа: v = int (5) – SilentGhost
Ссылка на Nice XKCD. –
Другим вариантом является переопределение метакласса. Это позволяет, помимо прочего, указать функции, которые должны существовать во всех классах.
Эта статья начинает обсуждать:
http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html
Это работает для встроенных типов, таких как int? – 2009-02-05 03:27:08
Я не думаю, что метаклассы дают вам возможность модифицировать встроенные типы. –
Правильно, это может только изменить поведение классов. – tsellon
У меня была большая удача с методом, описанным здесь:
http://mail.python.org/pipermail/python-dev/2008-January/076194.html
Я понятия не имею, если он работает на встроенных команд хоть.
К сожалению, ни один из методов не работает со встроенными модулями. – ESV
звучит как «патч обезьяны» – hop