Chciałbym zapisać pewne informacje o klasie jako zmiennych klasycznych (statycznych). Nie mogę jednak dowiedzieć się, jak te rzeczy zostały zainicjowane. Oto podstawowe, głupi przykład:Python Class Variable Initialization
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'
Ponieważ funkcja nazywa mnie (jak instrukcja print pracował), dlaczego nie klasa zmienna pobyt zmieniło? Czy muszę używać metaclass, jeśli nie chcę tego zrobić po zakończeniu definicji klasy?
[W szczególności chcę, aby clsMeth
była dekoratorem i zmienną klasy powinna być lista wszystkich funkcji, które zostały tak urządzone. Zgaduję, że to nie jest właściwa droga, aby to osiągnąć, więc ruszyłem dalej, ale nadal jestem ciekawy.]
EDYCJA: Jak wiele osób wskazało, powyższy kod wygrał ' t uruchom. Byłem uruchomiony w sesji IPython, gdzie wywołanie A.clsMeth()
będzie odwoływać się do poprzedniej wersji A
i uruchomić. Takie są zagrożenia związane z używaniem języka interpretowanego. I skończyło się z czymś takim:
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)
Być może powinno to być kolejne pytanie, ale kiedy outsideDec
dostaje uciekać, czy jest jakiś sposób, aby powiedzieć, co klasa to argument jest członkiem? Czy istnieje lepszy sposób wykonywania introspekcji w ten sposób w Pythonie? Rozumiem, że odchodzę tutaj, więc przyjmuję odpowiedź poniżej i zrobię więcej badań. Dziękuję wszystkim!
Otrzymuję błąd podczas wywoływania 'A.clsMeth', ponieważ' A' jest niezdefiniowane. Może używasz tłumacza i masz starą definicję "A"? – jcollado
Jak uruchomić tę próbkę? To nie działa, ponieważ składnia nie jest poprawna. 'A.clsMth()' nie może być umieszczone tak w definicji klasy. – gecco
@gecco: Pewnie, że może; składnia jest w porządku. Nie powiedzie się z błędem runtime, jak wspomniał jcollado, ponieważ przydział do 'A' nie nastąpił, gdy' AclsMeth() 'jest wywołany, ale możesz to zrobić. –