मेरे पास एक क्लास डेकोरेटर है जिसे __init_subclass__ विधि जोड़ना है, लेकिन जब मैं करता हूं:

class A:
 def __init_subclass__(cls, **kwargs):
  print(cls)

class B:
 pass

def p(cls, **kwargs):
 print(cls)

B.__init_subclass__ = p

class C(A):
 pass

# Prints class C

class D(B):
 pass

# TypeError: p() missing 1 required positional argument: 'cls'

अंतर यह प्रतीत होता है कि A.__init_subclass__ कक्षा ए की एक बाध्य विधि है, जबकि पी सिर्फ एक कार्य है। लेकिन कक्षा ए की विधि नए उपवर्ग से कैसे जुड़ती है जो कक्षा के संदर्भ से बाहर होने से पहले भी मौजूद नहीं है? B.__init_subclass__.__get__(B) का उपयोग करके p को B से बाँधने से cls तर्क नए उपवर्ग के बजाय स्वयं B के बराबर हो जाता है, जैसा कि जादुई रूप से बाध्य A.__init_subclass__ के मामले में होता है।

मैं वही जादू कैसे कर सकता हूं जो कक्षा बनने के बाद पाइथन खुद करता है?

0
Robin De Schepper 12 सितंबर 2020, 00:54

1 उत्तर

सबसे बढ़िया उत्तर

__init_subclass__ को क्लासमेथड होना चाहिए। type.__new__ स्वचालित रूप से __init_subclass__ को एक क्लासमेथोड बनाता है यदि यह क्लास क्रिएशन के समय एक नियमित फंक्शन है, लेकिन अगर आप बाद में __init_subclass__ जोड़ते हैं, तो ऐसा नहीं होता है।

अगर आप क्लास बनाने के बाद __init_subclass__ जोड़ते हैं, तो आपको खुद @classmethod डेकोरेटर जोड़ना होगा।

1
user2357112 supports Monica 11 सितंबर 2020, 21:59