2012-09-13 18 views
17

मेरी कक्षाओं में से एक में, मेरे पास कई गुण हैं जो प्राप्त करने और सेटिंग करने जैसी बहुत ही समान चीजें करते हैं। तो मैं एक कारखाने समारोह में property तर्क निकाला:पाइथन की 'संपत्ति' उप-वर्गीकरण

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 

हालांकि, मैं के बाद से पता चला है कि property एक वर्ग वास्तव में है, और उपवर्गीकरण यह इस के लिए एकदम सही होगा। मुझे प्रलेखन में कुछ भी नहीं मिला है जो बताता है कि मुझे ओवरराइड करने की आवश्यकता है (और __init__ आदि के तर्क हस्ताक्षर), और मैं वास्तव में इसके लिए सी स्रोत कोड में शिकार नहीं करना चाहता हूं। क्या कोई जानता है कि मुझे यह जानकारी कहां मिल सकती है?

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

संदर्भ के लिए, सी कार्यान्वयन यहां पाया जा सकता है: http://hg.python.org/cpython/file/tip/Objects/descrobject.c – nneonneo

+0

@nneonneo: धन्यवाद! लाइन 1228 पर बड़ी टिप्पणी ब्लॉक जवाब है। यदि आप इसे एक पूर्ण उत्तर में लिखना चाहते हैं तो मैं इसे स्वीकार करूंगा। –

+0

poorsod आप अपने प्रश्न का उत्तर दे सकते हैं :) –

उत्तर

18

यहाँ संपत्ति में कोड के लिए एक शुद्ध पायथन समकक्ष() है।

संबंधित मुद्दे