[उत्तर पाइथन 3.4 पर आधारित उत्तर; मेटाक्लास सिंटैक्स 2 में भिन्न है लेकिन मुझे लगता है कि तकनीक अभी भी काम करेगी]
आप इसे मेटाक्लास के साथ कर सकते हैं ... ज्यादातर। Dappawit लगभग काम करता है, लेकिन मुझे लगता है कि इसमें कोई कमी नहीं है:
class MetaFoo(type):
@property
def thingy(cls):
return cls._thingy
class Foo(object, metaclass=MetaFoo):
_thingy = 23
यह आपको कम महत्वपूर्ण चीज़ों पर एक classproperty हो जाता है, लेकिन वहाँ एक समस्या है ...
print("Foo.thingy is {}".format(Foo.thingy))
# Foo.thingy is 23
# Yay, the classmethod-property is working as intended!
foo = Foo()
if hasattr(foo, "thingy"):
print("Foo().thingy is {}".format(foo.thingy))
else:
print("Foo instance has no attribute 'thingy'")
# Foo instance has no attribute 'thingy'
# Wha....?
क्या हो यहाँ चल रहा है? मैं एक उदाहरण से कक्षा संपत्ति तक क्यों नहीं पहुंच सकता?
मैं जो कुछ मानता हूं उसे ढूंढने से पहले मैं थोड़ी देर के लिए इस पर अपना सिर मार रहा था। अजगर @properties descriptor documentation (जोर मेरा) से वर्णनकर्ता का एक सबसेट है, और,: विशेषता पहुँच के लिए
डिफ़ॉल्ट व्यवहार मिलता है, सेट करें, या एक वस्तु के शब्दकोश से विशेषता हटाना है। उदाहरण के लिए, a.x
एक देखने श्रृंखला a.__dict__['x']
के साथ शुरू है, तो type(a).__dict__['x']
, और सतत type(a)
छोड़कर metaclasses के आधार कक्षाओं के माध्यम से है।
तो विधि समाधान आदेश में हमारे वर्ग गुण (या मेटाक्लास में परिभाषित कुछ भी शामिल नहीं है) शामिल नहीं है। यह अंतर्निहित संपत्ति सजावट का एक उप-वर्ग बनाने के लिए संभव है जो अलग-अलग व्यवहार करता है, लेकिन (उद्धरण वांछित) मुझे इंप्रेशन गुगल रहा है कि डेवलपर्स के पास ऐसा करने के लिए एक अच्छा कारण था (जिसे मैं समझ नहीं पा रहा हूं) मार्ग।
इसका मतलब यह नहीं है कि हम भाग्य से बाहर हैं; हम वर्ग में ही ठीक पर गुण का उपयोग कर सकते ... और हम उदाहरण है, जो हम @property प्रेषकों बनाने के लिए उपयोग कर सकते हैं के भीतर type(self)
से वर्ग प्राप्त कर सकते हैं: के रूप में दोनों के लिए लक्षित
class Foo(object, metaclass=MetaFoo):
_thingy = 23
@property
def thingy(self):
return type(self).thingy
अब Foo().thingy
काम करता है कक्षा और उदाहरण! यदि व्युत्पन्न वर्ग इसके अंतर्निहित _thingy
(जो उपयोग केस है जो मुझे मूल रूप से इस शिकार पर मिला है) को बदल देता है तो यह सही काम भी जारी रखेगा।
यह मेरे लिए 100% संतुष्ट नहीं है - मेटाक्लास और ऑब्जेक्ट क्लास दोनों में सेटअप करने के लिए ऐसा लगता है जैसे यह DRY सिद्धांत का उल्लंघन करता है। लेकिन उत्तरार्द्ध सिर्फ एक लाइन प्रेषक है; मैं इसके साथ अधिकतर ठीक हूं, और यदि आप वास्तव में चाहते थे तो आप शायद इसे लैम्ब्डा या किसी चीज़ पर कॉम्पैक्ट कर सकते हैं।
मुझे पायथन नहीं पता ... क्या यह ऐसी चीज है जिसे आप ढूंढ रहे हैं? http://www.python.org/download/releases/2।2/descrintro/# संपत्ति –
यदि मैं इसे सही पढ़ रहा हूं, तो आप सेटर और गेटर (अन्य भाषाओं में) के रूप में कार्य करने के तरीकों को बना सकते हैं ताकि आप पहली बार संपत्ति मूल्य को आलसी लोड कर सकें ... जो मुझे लगता है क्या आप चाहते थे? –
@ व्हाइट ड्रैगन। जिस संपत्ति सुविधा पर आप देख रहे हैं वह क्लास इंस्टेंस में गुण जोड़ता है, न कि कक्षाओं के लिए। मैं 'उदाहरण के बारे में पूछ रहा हूं। मैं' e.i' नहीं हूं। –