Использование свойства Python () внутри метода - PullRequest
2 голосов
/ 21 июля 2010

Если вы знаете о встроенном свойстве Python: http://docs.python.org/library/functions.html#property

Я хочу переустановить свойство объекта таким способом, но мне нужно сделать это внутри метода, чтобы иметь возможность передавать ему некоторые аргументы, в настоящее время все веб-примеры property () определяют свойство вне методы и пробуя очевидное ...

def alpha(self, beta):
  self.x = property(beta)

... кажется, не работает, я рад, что вы можете показать мне мою концептуальную ошибку или другие альтернативные решения без разделения кода на подклассы (на самом деле мой код уже переклассифицирован) или без использования декораторов (это решение, которое я буду использовать если другого нет).

Спасибо.

Ответы [ 2 ]

4 голосов
/ 21 июля 2010

Свойства работают с использованием протокола дескриптора , который работает только с атрибутами объекта класса .Объект свойства должен храниться в атрибуте класса.Вы не можете «переопределить» его для каждого экземпляра.

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

class C(object):
    _default_x = 5
    _x = None
    @property
    def x(self):
        return self._x or self._default_x
    def alpha(self, beta):
        self._x = beta
1 голос
/ 21 июля 2010

В этом случае все, что вам нужно сделать в alpha(), это self.x = beta.Используйте свойство, если вы хотите реализовать методы получения и установки для атрибута, например:

class Foo(object):
    @property
    def foo(self):
        return self._dblookup('foo')

    @foo.setter
    def foo(self, value):
        self._dbwrite('foo', value)

, а затем сможете

f = Foo()
f.foo
f.foo = bar
...