Использование свойства в качестве имени метода в классе Python - PullRequest
0 голосов
/ 29 февраля 2012

Возможно ли это в Python?

class MyClass(object):
    @property
    def property(self):
        return self._property

То есть я хочу иметь свойство с именем 'property'. Это на самом деле работает нормально, но Затмение жалуется с предупреждением. Я думал, что встроенный декоратор @property живет в другом пространстве имен, чем методы и свойства в моих классах.

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

attr = property

class MyClass(object):
    @attr
    def property(self):
        return self._property

Я делаю это, но я все еще получаю предупреждение, так как я создал псевдоним для глобального встроенного @property decorator, но имя 'свойство' все еще является допустимым способом ссылки на него.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Проблема с присвоением имени свойству property заключается в следующем:

class Foo(object):
    @property
    def property(self):
        return "ham"

    @property
    def other_property(self):
        return "spam"

Второе свойство не может быть определено, поскольку вы скрыли имя property в определении класса.

Вы можете обойти это, переименовав property, как в вашем примере, но на вашем месте я бы не стал связываться со встроенными модулями таким образом. Это усложняет соблюдение вашего кода.

1 голос
/ 29 февраля 2012

Декораторы - это обычные функции, поэтому они живут в том же пространстве имен, что и другие функции.Действительно, ваша property функция находится внутри класса Foo;но оказывается, что именно здесь Python сначала ищет имена декораторов, поэтому возникает конфликт.

Это видно из того факта, что компилируется следующий код:

class Foo(object):

    def decfun(x): return "ham"

    @decfun
    def second(self, y): pass
...