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

  • BigDawsTv

    BigDawsTv

    20 HAZİRAN 2012
  • DroidModderX ROOT Master

    DroidModderX

    14 ŞUBAT 2011
  • habpsu

    habpsu

    25 Temmuz 2007