Установка свойства через строку - PullRequest
1 голос
/ 13 марта 2011

Я пытаюсь установить свойство класса Python вне класса через функцию setattr (self, item, value) .

class MyClass:
    def getMyProperty(self):
        return self.__my_property

    def setMyProperty(self, value):
        if value is None:
            value = ''
        self.__my_property = value

    my_property = property( getMyProperty, setMyProperty )

И в другом сценарии я создаю экземпляр и хочу указать свойство и позволить мутатору свойства обрабатывать простую проверку.

myClass = MyClass()
new_value = None

# notice the property in quotes
setattr(myClass, 'my_property', new_value)

Проблема в том, что он не вызывает мутатор setMyProperty (self, value) . Для быстрого теста, чтобы убедиться, что он не вызывается, я изменяю мутатор на:

    def setMyProperty(self, value):
        raise ValueError('WTF! Why are you not being called?')
        if value is None:
            value = ''
        self.__my_property = value

Я довольно новичок в Python, и, возможно, есть другой способ сделать то, что я пытаюсь сделать, но может кто-нибудь объяснить, почему не вызывается мутатор, когда setattr (self, item, value) называется?

Есть ли другой способ установить свойство через строку? Мне нужно, чтобы проверка внутри мутатора выполнялась при установке значения свойства.

1 Ответ

4 голосов
/ 13 марта 2011

у меня работает:

>>> class MyClass(object):
...   def get(self): return 10
...   def setprop(self, val): raise ValueError("hax%s"%str(val))
...   prop = property(get, setprop)
...
>>> i = MyClass()
>>> i.prop =4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in setprop
ValueError: hax4
>>> i.prop
10
>>> setattr(i, 'prop', 12)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in setprop
ValueError: hax12

Код, который вы вставили, похоже, делает то же самое, что и мой, за исключением того, что мой класс наследует от object, но это потому, что я использую Python 2.6, и я подумал, что в 2.7 все классы автоматически наследуются от object. Попробуйте, однако, и посмотрите, поможет ли это.

Чтобы сделать это еще яснее: попробуйте просто сделать myClass.my_property = 4. Это вызывает исключение? Если нет, то это проблема с наследованием от object - свойства работают только для классов нового стиля, то есть классов, которые наследуются от object.

...