SORU
26 EKİM 2008, Pazar


python özelliklerini ve kalıtım

Alt sınıfta üzerine yazmak istiyorum hangi özelliği ile bir temel sınıf (yöntem) var. İlk düşündüğüm gibi bir şey oldu:

class Foo(object):
    def _get_age(self):
        return 11

    age = property(_get_age)


class Bar(Foo):
    def _get_age(self):
        return 44

Bu (alt bar iş yapmaz.11 yaşında döndürür). Çalışan lambda ifadesi ile bir çözüm buldum:

age = property(lambda self: self._get_age())

Bu özellikleri kullanmak için doğru bir çözüm olduğunu ve bir alt sınıfta bunların üzerine, ya da bunu yapmak için başka bir tercih yolu var mı?

CEVAP
26 EKİM 2008, Pazar


Ben sadece property() Sınıf yöntemi geçersiz kılarken @classmethod dekoratör tekrar edersin gibi tekrar tercih ederim.

Bu çok ayrıntılı, en azından Python standartları gibi görünüyor olsa da, görebilirsiniz:

1) okumak için sadece özellikleri property bir dekoratör olarak kullanılabilir:

class Foo(object):
    @property
    def age(self):
        return 11

class Bar(Foo):
    @property
    def age(self):
        return 44

2) Python,properties grew a pair of methods setter 2.6 ve genel özellikleri uygulamak için kullanılabilir deleter kısayol için zaten mevcut salt okunur olanlar:

class C(object):
    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

Çok kolay önceki Python sürümü ile kullanılmak üzere benzer dekoratörler oluşturmak için:

class setter(object):
    def __init__(self, prop):
        self.prop = prop
    def __call__(self, setter):
        return property(
            fget=self.prop.fget,
            fset=setter,
            fdel=self.prop.fdel,
            doc=self.prop.__doc__)

class C(object):
    def __init__(self):
        self._age = None

    @property
    def age(self): 
        """My age"""
        return self._age

    @setter(age)
    def age(self, n):
        self._age = n

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fraser Raft

    Fraser Raft

    9 Mart 2010
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • John Lynn

    John Lynn

    8 Ocak 2010