मेरे पास मेटाक्लास के लिए एक अजीब और असामान्य उपयोग केस है जहां मैं परिभाषित किए जाने के बाद बेस क्लास के __metaclass__
को बदलना चाहता हूं ताकि इसके सबक्लास स्वचालित रूप से नए __metaclass__
का उपयोग कर सकें। लेकिन उस अजीब तरह से काम नहीं करता है:मैं कक्षा के __metaclass__ विशेषता को क्यों नहीं बदल सकता?
class MetaBase(type):
def __new__(cls, name, bases, attrs):
attrs["y"] = attrs["x"] + 1
return type.__new__(cls, name, bases, attrs)
class Foo(object):
__metaclass__ = MetaBase
x = 5
print (Foo.x, Foo.y) # prints (5, 6) as expected
class MetaSub(MetaBase):
def __new__(cls, name, bases, attrs):
attrs["x"] = 11
return MetaBase.__new__(cls, name, bases, attrs)
Foo.__metaclass__ = MetaSub
class Bar(Foo):
pass
print(Bar.x, Bar.y) # prints (5, 6) instead of (11, 12)
क्या मैं बहुत अच्छी तरह से मूर्ख/असमर्थित/अपरिभाषित हो सकता है कर रहा हूँ, लेकिन मैं के लिए मुझे के जीवन को समझ नहीं सकता कितनी पुरानी metaclass लागू की जा रही है, और मैं कम से कम समझना चाहता हूं कि यह कैसे संभव है।
संपादित करें:jsbueno
द्वारा किए गए एक सुझाव के आधार पर, मैं निम्न पंक्ति के साथ लाइन Foo.__metaclass__ = MetaSub
है, जो किया मैं वास्तव में क्या चाहते थे की जगह:
Foo = type.__new__(MetaSub, "Foo", Foo.__bases__, dict(Foo.__dict__))
टिप के लिए धन्यवाद, जो मैंने वही नहीं किया था, क्योंकि मैं अभी भी 'फू' के उप-वर्गों को मेटाक्लास रखना चाहता हूं, लेकिन मैंने अपने प्रश्न को उस समाधान को शामिल करने के लिए संपादित किया है जो आपके लिए आवश्यक था सुझाव। –