में क्लास-स्तरीय रीड-ओनली प्रॉपर्टीज Python में क्लास-स्तरीय रीड-ओनली प्रॉपर्टी बनाने का कोई तरीका है?पायथन
x = Foo.CLASS_PROPERTY
लेकिन कहने से किसी को रोकने के: उदाहरण के लिए, अगर मैं एक वर्ग Foo
है, मैं कहना चाहता हूँ
Foo.CLASS_PROPERTY = y
संपादित करें: मैं Alex Martelli's solution की सादगी पसंद है, लेकिन नहीं वाक्यविन्यास है कि इसकी आवश्यकता है। दोनों अपने और ~unutbu's answer रों निम्नलिखित समाधान है, जो करीब की भावना करने के लिए है कि मैं क्या तलाश कर रहा था प्रेरित:
class const_value (object):
def __init__(self, value):
self.__value = value
def make_property(self):
return property(lambda cls: self.__value)
class ROType(type):
def __new__(mcl,classname,bases,classdict):
class UniqeROType (mcl):
pass
for attr, value in classdict.items():
if isinstance(value, const_value):
setattr(UniqeROType, attr, value.make_property())
classdict[attr] = value.make_property()
return type.__new__(UniqeROType,classname,bases,classdict)
class Foo(object):
__metaclass__=ROType
BAR = const_value(1)
BAZ = 2
class Bit(object):
__metaclass__=ROType
BOO = const_value(3)
BAN = 4
अब, मैं मिलता है:
Foo.BAR
# 1
Foo.BAZ
# 2
Foo.BAR=2
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# AttributeError: can't set attribute
Foo.BAZ=3
#
मैं इस समाधान क्योंकि पसंद करते हैं:
- सदस्यों इस तथ्य के बाद के बजाय इनलाइन घोषित करने के साथ के रूप में,
type(X).foo = ...
- सदस्यों के मान मेटाक्लास के कोड के विपरीत वास्तविक वर्ग के कोड में सेट हैं।
- मैं के लिए
const_value
वस्तुओं को सही ढंग से व्याख्या की जा करने के लिए__metaclass__
सेट करने के लिए:
यह क्योंकि अभी भी नहीं आदर्श है।
- मैं के लिए
const_value
एस सादा मूल्यों की तरह "व्यवहार" नहीं करते हैं। उदाहरण के लिए, मैं कक्षा में किसी विधि के पैरामीटर के लिए इसे डिफ़ॉल्ट मान के रूप में उपयोग नहीं कर सका।
कोई भी कभी भी Foo.CLASS_PROPERTY सेट करने का प्रयास क्यों करेगा? यह सैद्धांतिक उदाहरण को रोकने के लिए योजना पर सादगी चुनने के लिए पाइथन में सामान्य शैली है जहां कोई बेवकूफ कुछ करता है। लोगों को अपने कोड के साथ बेवकूफ सामान करने से रोकने के लिए आप कुछ भी नहीं कर सकते हैं। –
@ माइक: आप सही हैं; सामान्य ज्ञान लोगों को इन गुणों को संशोधित नहीं करने के लिए कहता है। और फिर भी, कभी-कभी, वे संशोधित हो जाते हैं। यही कारण है कि मैं इसे वर्तनी के लिए पसंद करता हूं (सभी कैप्स के मुकाबले अधिक स्पष्ट रूप से)। निजी सदस्यों का उपयोग करने के समान ही तर्क। स्पष्ट इंटरफेस अच्छे हैं। मुझे गलत मत समझो: मुझे सादगी भी पसंद है। अगर मैं इसके लिए कुछ अंतर्निहित सुविधा (जैसे @classproperty सजावट या कुछ) की तरह था तो मैं बहुत पसंद करूंगा। जैसा कि है, मुझे यह भी यकीन नहीं है कि मैं उपर्युक्त समाधान का उपयोग करूंगा यदि इसे हर बार '__metaclass__' सेट करने की आवश्यकता होती है। ऑल-कैप्स अब के लिए जीत सकते हैं। भविष्य से लोगों को – mjumbewu
नोट: आधुनिक अजगर संस्करण 'उपयोग कर सकते हैं नई शैली की कक्षाओं में @ property': http://docs.python.org/library/functions.html#property –