मैं एक metaclass मिला कहो ProductClass का __init__
ट्रिगर हुआ? बस मेटा के __call__
की वजह से?Metaclass के "__call__" और उत्पाद श्रेणी के "__init__"
अद्यतन:
अब, मैं ProductClass के लिए __new__
जोड़ें:
class ProductClass(object):
__metaclass__ = Meta
def __new__(cls, *args):
print "ProductClass: __new__ with", args
return super(ProductClass, cls).__new__(cls, *args)
def __init__(self, *args):
print "ProductClass: __init__ with", args
p = ProductClass(1)
यह मेटा के __call__
की कॉल करने के लिए जिम्मेदारी है ProductClass के __new__
और __init__
?
क्या हुआ यदि मैं "__new__" ProductClass में मिल गया? मेटा का "__call__" कॉल क्लाउड क्लास का "__new__" और "__init__" होगा? मेरा अद्यतन देखें। – Alcott
और स्पष्ट रूप से, मेटा के "__call__" को उत्पाद क्लास के "__new__" से पहले पहले कहा जाता है। – Alcott
समस्या यह है कि 'ProductClass .__ new__' और 'ProductClass .__ init__' को कॉल करने के लिए' मेटा .__ कॉल__' आवश्यक है। आम तौर पर, 'टाइप .__ call__' यह आपके लिए करता है, लेकिन जब आप' मेटा .__ कॉल__ 'को परिभाषित करते हैं, तो आप उस व्यवहार को _override_ करते हैं, जिसका अर्थ यह है कि जब तक आप ऐसा नहीं करते हैं तब तक निष्पादित नहीं किया जाता है। इसलिए, आपको या तो '__new__' और' __init__' को कॉल करने की आवश्यकता है, या 'टाइप .__ कॉल __ (cls, * args) जैसे किसी चीज़ पर कॉल करें। –