2016-11-15 4 views
4

Python поддерживает @property декоратор для экземпляров, как так:Per-класса @property декоратор в Python

class MyClass(object): 
    def __init__(self): 
     self._friend_stack = [1] 
    @property 
    def current_friend(self): 
     return self._friend_stack[0] 

myobj = MyClass() 
myobj.current_friend # 1 

Можно ли что-то подобное для классов, так что поведение что-то вроде этого (по с установки и получения методов, например):

class MyClass(object): 
    _friend_stack = [1] 

    @property 
    def current_friend(cls): 
     return cls._friend_stack[0] 

MyClass.current_friend # 1 
+2

Думает, что вы хотите '@ classmethod' –

+1

Возможного дубликат [статического переменного класса в Python] (http://stackoverflow.com/questions/68645/static-class-variables-in-python) –

+0

'@ classmethod' позволит мне делать' MyClass.current_friend() ', но это не позволило мне сделать MyClass.current_friend = 2'. Мне бы хотелось, чтобы последнее поведение. Я также хотел бы иметь возможность запускать код при доступе к переменным. – Pablo

ответ

4

в Python 3:

class MyMeta(type): 
    def current_friend(cls): 
     return cls._friend_stack[0] 
    current_friend = property(current_friend) 

class MyClass(metaclass=MyMeta): 
    _friend_stack = [1] 

[безумный смех следует]

+1

Это (с использованием метакласса) на самом деле является правильным и [похоже, единственным способом сделать это] (https://mail.python.org/pipermail/python-ideas/2011-January/008959.html) с версии 3.5. Существует проблема [open issue] (https://bugs.python.org/issue24941) относительно добавления декоратора 'classproperty', и Эрик Брей предполагает, что писать чистую версию Python« тривиально ». Однако [его реализация] (https://mail.python.org/pipermail/python-ideas/2015-August/035349.html) несколько нарушена: как отметил Ник Коглан, установка/удаление атрибута через класс будет полностью обходите дескриптор. –