Использование свойства в качестве имени метода в классе 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