Я хотел бы хранить некоторую информацию о классе в виде переменных класса (статических).Тем не менее, я не могу понять, как эти вещи инициализируются.Вот простой пример:
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'
Поскольку функция была вызвана (как работает оператор print), почему переменная класса не изменилась?Нужно ли использовать метакласс, если я не хочу делать это после завершения определения класса?
[В частности, я хочу, чтобы 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?Я понимаю, что отклоняюсь от курса, поэтому приму ответ ниже и проведу дополнительные исследования.Спасибо всем!