Я хотел бы сохранить некоторую информацию о классе как классовые (статические) переменные. Однако я не могу понять, как эти вещи инициализируются. Вот простой, тупой пример:
class A(object):
clsVar = 'a'
@classmethod
def clsMeth(cls):
print 'changing clsVar'
cls.clsVar = 'b'
A.clsMeth()
# prints 'changing clsVar'
print A.clsVar # prints 'a'
A.clsVar = 'b'
print A.clsVar # prints 'b'
Поскольку функция была вызвана (когда сработал оператор печати), почему переменная класса не изменилась? Должен ли я использовать метакласс, если я не хочу этого делать после завершения определения класса?
[В частности, я хочу, чтобы clsMeth
был декоратором и чтобы переменная класса представляла собой список всех функций, которые были украшены таким образом. Я предполагаю, что это неправильный способ сделать это, поэтому я двинулся дальше, но мне все еще любопытно.]
РЕДАКТИРОВАТЬ: Как отмечали многие люди, приведенный выше код не будет бег. Я запускал его в сеансе IPython, где вызов A.clsMeth ()
обращается к предыдущей версии A
и запускается. Думаю, таковы риски использования интерпретируемого языка. В итоге я получил что-то вроде этого:
outsideDict = {}
def outsideDec(func):
outsideDict[func.__name__] = func
class A(object):
@outsideDec
def someMethod(self):
print 'ID %s' % id(self)
def otherMethod(self):
print 'other'
print outsideDict
one, two = A(), A()
outsideDict['someMethod'](one)
outsideDict['someMethod'](two)
Возможно, это должен быть другой вопрос, но когда запускается outsideDec
, есть ли способ узнать, членом какого класса является этот аргумент? Или есть лучший способ сделать такой самоанализ в Python? Я понимаю, что отклоняюсь от курса, поэтому приму ответ ниже и проведу дополнительное исследование. Спасибо всем!