2009-02-05 2 views
31

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

MyRandomMethod() 

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

myInt.MyRandomMethod() 
+1

звучит как «патч обезьяны» – hop

ответ

39

вас могут добавлять любые методы, которые вам нравятся, в объектах класса, определенных в коде Python (патч-апк AKA):

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


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

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

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

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

+3

Чем дольше я использую Python, тем лучше! –

7

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

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 

надежде, что проясняет ваш вопрос

+0

Но я имею в виду вызов непосредственно из существующих типов, а не из MyInt, но int. Так же, как v = 5; v.RandomMethod(); –

+0

вы можете вызвать класс int (int), но вам нужно будет создать переменную типа: v = int (5) – SilentGhost

+3

Ссылка на Nice XKCD. –

0

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

Эта статья начинает обсуждать:

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

+0

Это работает для встроенных типов, таких как int? – 2009-02-05 03:27:08

+1

Я не думаю, что метаклассы дают вам возможность модифицировать встроенные типы. –

+0

Правильно, это может только изменить поведение классов. – tsellon