2013-08-29 9 views
28

को समझना मैं पूछना चाहता हूं कि with_metaclass() कॉल क्लास की परिभाषा में क्या है।पायथन मेटाक्लास: 'with_metaclass()'

उदा .:

class Foo(with_metaclass(Cls1, Cls2)): 
  • यह एक विशेष मामले में जहां एक वर्ग एक metaclass से विरासत है?
  • क्या नई कक्षा एक मेटाक्लास भी है?

उत्तर

52

with_metaclass(), यह आसान दोनों अजगर 2 के लिए कोड विकसित करने के लिए बनाने के लिए और 3

यह आप के लिए निर्दिष्ट मेटा वर्ग के साथ एक आधार वर्ग बनाता है एक उपयोगिता वर्ग कारखाने six library द्वारा प्रदान समारोह है के साथ संगत पायथन का संस्करण आप कोड चला रहे हैं।

प्रलेखन से हवाला देते हुए:

आधार वर्ग आधार और metaclass metaclass साथ एक नया वर्ग बनाएँ। यह इस तरह वर्ग घोषणाओं में इस्तेमाल किया जा बनाया गया है:

अजगर 2:

class MyClass(object): 
    __metaclass__ = Meta 

from six import with_metaclass 

class Meta(type): 
    pass 

class Base(object): 
    pass 

class MyClass(with_metaclass(Meta, Base)): 
    pass 

इसका कारण यह है वाक्य रचना एक metaclass अजगर 2 और 3 के बीच बदल संलग्न करने के लिए की जरूरत है

अजगर 3:

class MyClass(metaclass=Meta): 
    pass 

with_metaclass() फ़ंक्शन इस तथ्य का उपयोग करता है कि मेटाक्लास ए) उप-वर्गों द्वारा विरासत में मिला है, और बी) नए वर्गों को उत्पन्न करने के लिए मेटाक्लास का उपयोग किया जा सकता है; यह प्रभावी रूप से एक कारखाने के रूप में metaclass का उपयोग कर एक खाली वर्ग उत्पन्न करने के लिए एक नया आधार वर्ग बनाता है:

def with_metaclass(meta, *bases): 
    """Create a base class with a metaclass.""" 
    return meta("NewBase", bases, {}) 

NewBase आधार वर्ग के metaclass meta, दोनों अजगर 2 पर और 3 है

+2

बस छह में, सिंटैक्स (ऊपर पाइथन 2 और 3 के व्यवहार से मेल खाने के लिए) को स्पष्ट करने के लिए: 'क्लास माईक्लास (with_metaclass (मेटा, ऑब्जेक्ट)): पास' (जहां ऑब्जेक्ट वैकल्पिक है)। –

12

अद्यतन: six.with_metaclass() फ़ंक्शन को बाद में एक सजावटी संस्करण, यानी @six.add_metaclass() के साथ पैच किया गया है। यह अद्यतन आधार वस्तुओं से संबंधित कुछ mro मुद्दों को हल करता है।

import six 

@six.add_metaclass(Meta) 
class MyClass(Base): 
    pass 

Here are the patch notes और here is a similar, detailed example and explanation एक डेकोरेटर विकल्प प्रयोग करने के लिए: नई डेकोरेटर इस प्रकार आवंटित किया जाएगा।

संबंधित मुद्दे