Özellik() kullanarak classmethods üzerinde
İki sınıf bir metot var (classmethod kullanarak() fonksiyonu) aslında statik bir değişken nedir ve ayarı için. Özelliği kullanmaya çalıştım() bu işlev, ama bir hata sonucu. Yorumlayıcı aşağıdaki: hata yeniden oluşturmak için başardı
>>> class foo(object):
... _var=5
... def getvar(cls):
... return cls._var
... getvar=classmethod(getvar)
... def setvar(cls,value):
... cls._var=value
... setvar=classmethod(setvar)
... var=property(getvar,setvar)
...
>>> f.getvar()
5
>>> f.setvar(4)
>>> f.getvar()
4
>>> f.var
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: 'classmethod' object is not callable
>>> f.var=5
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: 'classmethod' object is not callable
Bu özelliği kullanmak mümkün() classmethod dekore edilmiş fonksiyonlar ile fonksiyon?
CEVAP
Python 2.2 release notları okurken, aşağıdaki buluyorum.
Get yöntemi [bir özelliği] adlı olmayacaktır zaman özelliği bir sınıf olarak erişilir öznitelik (C. x) yerine bir örnek öznitelik (() C.x). Eğer ____ işlemi geçersiz kılmak istiyorum bir sınıf olarak kullanıldıĞında özellikleri öznitelik, özellik alt - yeni tarzı bir tip kendisi-için __onun__ get yöntemi uzatmak, ya da yapabilirsiniz sıfırdan tanımlayıcı bir türü tanımlamak yeni tarzı bir sınıf oluşturarak ____, ____ set ve tanımlar ____ yöntemleri silin.
NOT: aşağıdaki yöntemi aslında belirleyiciler, sadece alıcılar için çalışmıyor.
Bu nedenle, öngörülen çözüm özelliği bir alt sınıf olarak bir ClassProperty oluşturmak için olduğuna inanıyorum.
class ClassProperty(property):
def __get__(self, cls, owner):
return self.fget.__get__(None, owner)()
class foo(object):
_var=5
def getvar(cls):
return cls._var
getvar=classmethod(getvar)
def setvar(cls,value):
cls._var=value
setvar=classmethod(setvar)
var=ClassProperty(getvar,setvar)
assert foo.getvar() == 5
foo.setvar(4)
assert foo.getvar() == 4
assert foo.var == 4
foo.var = 3
assert foo.var == 3
Ancak belirleyiciler aslında çalışmıyor:
foo.var = 4
assert foo.var == foo._var # raises AssertionError
foo._var değişmez, sadece yeni bir değer özelliği üzerine.
Ayrıca bir mimar olarak ClassProperty kullanabilirsiniz:
class Foo(object):
_var = 5
@ClassProperty
@classmethod
def var(cls):
return cls._var
@var.setter
@classmethod
def var(cls, value):
cls._var = value
assert foo.var == 5

Dizeden özellik değeri C yansıma kulla...
Kullanarak "yeni" bir yapı ü...
'onlarınki kabul' veya '...
Sadece ilk maç üzerinde hareket eder, ...
Nasıl css display none değişiklik veya...