@@ -602,27 +602,27 @@ def __new__(cls, /, *args, **kwargs):
602
602
603
603
arg .__new__ = staticmethod (__new__ )
604
604
605
- original_init_subclass = arg .__init_subclass__
606
- # We need slightly different behavior if __init_subclass__
607
- # is a bound method (likely if it was implemented in Python)
608
- if isinstance (original_init_subclass , MethodType ):
609
- original_init_subclass = original_init_subclass .__func__
605
+ if "__init_subclass__" in arg .__dict__ :
606
+ # __init_subclass__ is directly present on the decorated class.
607
+ # Synthesize a wrapper that calls this method directly.
608
+ original_init_subclass = arg .__init_subclass__
609
+ # We need slightly different behavior if __init_subclass__
610
+ # is a bound method (likely if it was implemented in Python).
611
+ # Otherwise, it likely means it's a builtin such as
612
+ # object's implementation of __init_subclass__.
613
+ if isinstance (original_init_subclass , MethodType ):
614
+ original_init_subclass = original_init_subclass .__func__
610
615
611
616
@functools .wraps (original_init_subclass )
612
617
def __init_subclass__ (* args , ** kwargs ):
613
618
warn (msg , category = category , stacklevel = stacklevel + 1 )
614
619
return original_init_subclass (* args , ** kwargs )
615
-
616
- arg .__init_subclass__ = classmethod (__init_subclass__ )
617
- # Or otherwise, which likely means it's a builtin such as
618
- # object's implementation of __init_subclass__.
619
620
else :
620
- @functools .wraps (original_init_subclass )
621
- def __init_subclass__ (* args , ** kwargs ):
621
+ def __init_subclass__ (cls , * args , ** kwargs ):
622
622
warn (msg , category = category , stacklevel = stacklevel + 1 )
623
- return original_init_subclass (* args , ** kwargs )
623
+ return super ( arg , cls ). __init_subclass__ (* args , ** kwargs )
624
624
625
- arg .__init_subclass__ = __init_subclass__
625
+ arg .__init_subclass__ = classmethod ( __init_subclass__ )
626
626
627
627
arg .__deprecated__ = __new__ .__deprecated__ = msg
628
628
__init_subclass__ .__deprecated__ = msg
0 commit comments