का उपयोग कर this answer के बाद ऐसा लगता है कि एक वर्ग metaclass' metaclass के बाद वर्ग परिभाषित किया गया है बदला जा सकता है निम्नलिखित * का उपयोग करके कक्षा की स्थापना:'एक डेकोरेटर
class MyMetaClass(type):
# Metaclass magic...
class A(object):
pass
A = MyMetaClass(A.__name__, A.__bases__, dict(A.__dict__))
एक समारोह
def metaclass_wrapper(cls):
return MyMetaClass(cls.__name__, cls.__bases__, dict(cls.__dict__))
को परिभाषित करना
मुझे इतना की तरह एक वर्ग परिभाषा करने के लिए एक डेकोरेटर लागू करने के लिए अनुमति देता है,
@metaclass_wrapper
class B(object):
pass
यह देखना एमएस कि मेटाक्लास जादू B
पर लागू होता है, हालांकि B
में __metaclass__
विशेषता नहीं है। उपरोक्त विधि वर्ग परिभाषाओं को metaclasses लागू करने के लिए एक समझदार तरीका है, भले ही मैं definiting कर रहा हूँ और एक वर्ग फिर से definiting, या मैं बेहतर बस
class B(object):
__metaclass__ = MyMetaClass
pass
मुझे लगता है इन दोनों के बीच कुछ मतभेद हैं लिख होगा तरीकों।
* नोट, जुड़ा हुआ सवाल है, MyMetaClass(A.__name__, A.__bases__, A.__dict__)
में मूल जवाब, वापस आने वाले TypeError
:
TypeError: type() argument 3 must be a dict, not dict_proxy
ऐसा लगता है कि A
(वर्ग परिभाषा) की __dict__
विशेषता, एक प्रकार dict_proxy
है, जबकि __dict__
उदाहरणA
के प्रकार dict
का प्रकार है। ऐसा क्यों है? क्या यह एक पायथन 2.x बनाम 3.x अंतर है?
मैं बस सोच रहा था कि कक्षा सजावट में '__metaclass__' विशेषता को सेट करने के बराबर एक सजावटी था। मुझे लगता है कि मेरे प्रश्न का एक और हिस्सा यह है कि मेरे 'सजावटी' ने काम करने के लिए * प्रतीत किया था, लेकिन मैंने देखा कि सजाए गए वर्ग में '__metaclass__' विशेषता नहीं है, इसलिए स्पष्ट रूप से दो तरीकों के बीच एक अंतर है; यह क्यों है? – Chris