Подтвердить что ты не робот

Методы расширения в Python

Есть ли у Python методы расширения, такие как С#? Можно ли вызвать такой метод, как:

MyRandomMethod()

для существующих типов, таких как int?

myInt.MyRandomMethod()
4b9b3361

Ответ 1

Вы можете добавить любые методы, которые вам нравятся, для объектов класса, определенных в коде Python (исправление обезьяны AKA):

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


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

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

Это не работает со встроенными типами, потому что их __dict__ недоступен для записи (это a dictproxy).

Нет, нет никакого реального механизма расширения в Python.

Ответ 2

не уверен, что это то, что вы просите, но вы можете расширить существующие типы, а затем называть все, что вам нравится, в новой вещи:

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

надеюсь, что уточнит ваш вопрос

Ответ 3

Это можно сделать с помощью 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 и т.д.

Ответ 5

Другой вариант - переопределить метаклассу. Это позволяет, помимо прочего, указать функции, которые должны существовать во всех классах.

В этой статье обсуждается:

http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html