2012-09-13 20 views
17

Sınıflarımdan birinde, alma ve ayarlamada çok benzer şeyler yapan birçok özelliğim var. Bu yüzden bir fabrika fonksiyonuna içine property argümanlar soyutlanmış:Python'un `property` alt sınıfını oluşturma

def property_args(name): 
    def getter(self): 
     # do something 
     return getattr(self, '_' + name) 
    def setter(self, value) 
     # do something 
     setattr(self, '_' + name, value) 
    return getter, setter 

class MyClass(object): 
    def __init__(self): 
     self._x = None 
    x = property(*property_args('x')) # obviously there's more than one of these IRL 

Ancak, o zamandan beri property bir sınıf aslında keşfetti ve bunun için mükemmel olurdu sınıflara ettik. Belgedeki neyi geçersiz kılmam gerektiğini (ve __init__ vb. Argüman imzalarını) açıklayan hiçbir şey bulamadım ve bunun için C kaynak kodunda avlanmak zorunda kalmak istemiyorum. Bu bilgiyi nerede bulabileceğimi bilen var mı?

class Property(object): 
    "Emulate PyProperty_Type() in Objects/descrobject.c" 

    def __init__(self, fget=None, fset=None, fdel=None, doc=None): 
     self.fget = fget 
     self.fset = fset 
     self.fdel = fdel 
     if doc is None and fget is not None: 
      doc = fget.__doc__ 
     self.__doc__ = doc 

    def __get__(self, obj, objtype=None): 
     if obj is None: 
      return self 
     if self.fget is None: 
      raise AttributeError("unreadable attribute") 
     return self.fget(obj) 

    def __set__(self, obj, value): 
     if self.fset is None: 
      raise AttributeError("can't set attribute") 
     self.fset(obj, value) 

    def __delete__(self, obj): 
     if self.fdel is None: 
      raise AttributeError("can't delete attribute") 
     self.fdel(obj) 

    def getter(self, fget): 
     return type(self)(fget, self.fset, self.fdel, self.__doc__) 

    def setter(self, fset): 
     return type(self)(self.fget, fset, self.fdel, self.__doc__) 

    def deleter(self, fdel): 
     return type(self)(self.fget, self.fset, fdel, self.__doc__) 
+1

Referans için, C uygulaması şu adreste bulunabilir: http://hg.python.org/cpython/file/tip/Objects/descrobject.c – nneonneo

+0

@nneonneo: Teşekkürler! 1228 satırındaki büyük yorum bloğu yanıttır. Bunu tam bir cevapta yazmak istiyorsanız, kabul edeceğim. –

+0

poorsod kendi sorunuzu cevaplayabilirsiniz :) –

cevap

18

İşte özelliğinde kodu için saf Python eşdeğer() olduğunu.

İlgili konular