Использование свойства в качестве имени метода в классе Python

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

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

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

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

attr = property

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

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

Есть идеи?

2 ответа

Решение

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

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

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

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

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

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

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

class Foo(object):

    def decfun(x): return "ham"

    @decfun
    def second(self, y): pass
Другие вопросы по тегам