Инициализация переменной класса Python

Я хотел бы сохранить некоторую информацию о классе как классовые (статические) переменные. Однако я не могу понять, как эти вещи инициализируются. Вот простой, тупой пример:

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? Я понимаю, что отклоняюсь от курса, поэтому приму ответ ниже и проведу дополнительное исследование. Спасибо всем!

5
задан Peter 14 December 2011 в 21:32
поделиться