SORU
24 EYLÜL 2008, ÇARŞAMBA


Ö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
5 EYLÜL 2009, CUMARTESİ


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • glowpinkstah

    glowpinkstah

    16 Mayıs 2006
  • SuppressedStorm

    SuppressedSt

    11 AĞUSTOS 2013