मेरी कक्षाओं में से एक में, मेरे पास कई गुण हैं जो प्राप्त करने और सेटिंग करने जैसी बहुत ही समान चीजें करते हैं। तो मैं एक कारखाने समारोह में 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__)
संदर्भ के लिए, सी कार्यान्वयन यहां पाया जा सकता है: http://hg.python.org/cpython/file/tip/Objects/descrobject.c – nneonneo
@nneonneo: धन्यवाद! लाइन 1228 पर बड़ी टिप्पणी ब्लॉक जवाब है। यदि आप इसे एक पूर्ण उत्तर में लिखना चाहते हैं तो मैं इसे स्वीकार करूंगा। –
poorsod आप अपने प्रश्न का उत्तर दे सकते हैं :) –