2015-10-25 8 views
6

अजगर 3.4+ में, हमपायथन 3.4+ में, एबीसी बनाम एबीसीएमटा का उपयोग करने के बीच कोई अंतर?

class Foo(abc.ABC): 
    ... 

कर सकते हैं या हम कर सकते हैं

class Foo(metaclass=abc.ABCMeta): 
    ... 

वहाँ रहे हैं दो कि मैं के बारे में पता होना चाहिए के बीच कोई मतभेद?

+0

@ वालरस - मेरा मानना ​​है कि मतभेद Python3.X लिए नई नहीं हैं। कक्षा उदाहरण बनाता है और मेटाक्लास वर्ग बनाता है। जब आप कक्षा का आह्वान करते हैं तो वह उस वर्ग के लिए एक अंतर्निहित मेटाक्लास 'प्रकार' का उपयोग करता है, तो आप इसे नहीं जानते हैं। मुझे लगता है कि ज्यादातर समय आपको मेटाक्लास का उपयोग करने की आवश्यकता नहीं होगी, हालांकि मुझे लगता है कि हमारे सिर में यह हमेशा मेटाक्लास का उपयोग करके कुछ लाभ उठाने के लिए एक अच्छा विचार लगता है। – inbinder

उत्तर

6

abc.ABC मूल रूप से केवल metaclass=abc.ABCMeta पर एक अतिरिक्त परत। i.e abc.ABC अंतर्निहित रूप से हमारे लिए मेटाक्लास को परिभाषित करता है।

(स्रोत: https://hg.python.org/cpython/file/3.4/Lib/abc.py#l234)

class ABC(metaclass=ABCMeta): 
    """Helper class that provides a standard way to create an ABC using 
    inheritance. 
    """ 
    pass 

फर्क सिर्फ इतना है कि पूर्व स्थिति में आप एक साधारण विरासत की जरूरत है और बाद में आप metaclass निर्दिष्ट करने की आवश्यकता है।

What's new in Python 3.4 (जोर मेरा) से:

नए वर्ग ABCABCMeta अपने मेटा वर्ग के रूप में है। ABC आधार कक्षा के रूप में metaclass=abc.ABCMeta, निर्दिष्ट करने के समान अनिवार्य रूप से वही प्रभाव है, लेकिन पढ़ने के लिए आसान और टाइप करना आसान है।


संबंधित मुद्दा:Create abstract base classes by inheritance rather than a direct invocation of __metaclass__

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