2015-02-12 5 views
3

Итак, исправление обезьяны довольно удивительно, но что, если я хочу, чтобы обезьяна патла @property?Monkey patching Python Propertyersers (и getters?)

Например, чтобы обезьяна патч метод:

def new_method(): 
    print('do stuff') 
SomeClass.some_method = new_method 

Однако свойства в Python переписать знак =.

Быстрый пример, позволяет сказать, что я хочу изменить х, чтобы быть 4. Как будет идти о выполнении этого ?:

class MyClass(object): 
    def __init__(self): 
     self.__x = 3 

    @property 
    def x(self): 
     return self.__x 

    @x.setter 
    def x(self, value): 
     if value != 3: 
      print('Nice try') 
     else: 
      self.__x = value 

foo = MyClass() 
foo.x = 4 
print(foo.x) 
foo.__x = 4 
print(foo.x) 

Nice попробовать

+0

Вопрос as-ask не имеет ничего общего с свойствами, но все, что связано с изменением имени из-за двойной переменной подчеркивания 'self .__ x' –

ответ

2

Используя _ClassName__attribute, вы можете получить доступ к атрибуту:

>>> class MyClass(object): 
...  def __init__(self): 
...   self.__x = 3 
...  @property 
...  def x(self): 
...   return self.__x 
...  @x.setter 
...  def x(self, value): 
...   if value != 3: 
...    print('Nice try') 
...   else: 
...    self.__x = value 
... 
>>> foo = MyClass() 
>>> foo._MyClass__x = 4 
>>> foo.x 
4 

Private Variables and Class-local References - Python tutorial См, особенно частей, которые упоминают о имя коверкая.

Смежные вопросы