SORU
10 HAZİRAN 2010, PERŞEMBE


Python tembel özelliği dekoratör

Son zamanlarda mevcut kod tabanı inceledim ve örnek bir sürü tembel, yani öznitelikleri refactored. kurucu başlatılmalı ama sadece üzerine ilk okuma değil. Bu öznitelikler örneğinin ömrü boyunca değişmez, ama bu ilk kez ve sadece özel durumlar için erişilebilir hesaplamak için gerçek bir darboğaz yapıyorlar.

Aşağıdaki kod parçası, tekrar tekrar çeşitli sınıflar arasında: çeşitli öznitelikleri için kendimi yazarak buluyorum

class testA(object):

  def __init__(self):
    self._a = None
    self._b = None

  @property
  def a(self):
    if self._a is None:
      # Calculate the attribute now
      self._a = 7
    return self._a

  @property
  def b(self):
    #etc

Sadece haberim olmayan varolan bir dekoratör bunu yapmak için zaten Python var mı? Ya da, orada oldukça kolay bir yolu yok bu bir dekoratör tanımlamak için?

Python 2.5, 2.6 ama cevap hala önemli ölçüde farklıysa ilginç olabilir altında çalışıyorum.

CEVAP
10 HAZİRAN 2010, PERŞEMBE


İşte boilerplace kaldırır tembel özelliği dekoratör için örnek bir uygulama:

def lazyprop(fn):
    attr_name = '_lazy_'   fn.__name__
    @property
    def _lazyprop(self):
        if not hasattr(self, attr_name):
            setattr(self, attr_name, fn(self))
        return getattr(self, attr_name)
    return _lazyprop


class Test(object):

    @lazyprop
    def a(self):
        print 'generating "a"'
        return range(5)

İnteraktif oturum:

>>> t = Test()
>>> t.__dict__
{}
>>> t.a
generating "a"
[0, 1, 2, 3, 4]
>>> t.__dict__
{'_lazy_a': [0, 1, 2, 3, 4]}
>>> t.a
[0, 1, 2, 3, 4]

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LardTardProductions's channel

    LardTardProd

    10 NİSAN 2009
  • mipd1980

    mipd1980

    25 EKİM 2006
  • Visual Life

    Visual Life

    3 Temmuz 2006