mirror of
https://github.com/python/cpython.git
synced 2025-07-31 23:23:11 +00:00
bpo-44806: Fix __init__ in subclasses of protocols (GH-27545)
Non-protocol subclasses of protocol ignore now the __init__ method
inherited from protocol base classes.
(cherry picked from commit 043cd60abe
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
9de590151d
commit
2cc19a5463
3 changed files with 48 additions and 2 deletions
|
@ -1379,8 +1379,7 @@ def _is_callable_members_only(cls):
|
|||
|
||||
|
||||
def _no_init(self, *args, **kwargs):
|
||||
if type(self)._is_protocol:
|
||||
raise TypeError('Protocols cannot be instantiated')
|
||||
raise TypeError('Protocols cannot be instantiated')
|
||||
|
||||
def _caller(depth=1, default='__main__'):
|
||||
try:
|
||||
|
@ -1523,6 +1522,15 @@ class Protocol(Generic, metaclass=_ProtocolMeta):
|
|||
|
||||
# We have nothing more to do for non-protocols...
|
||||
if not cls._is_protocol:
|
||||
if cls.__init__ == _no_init:
|
||||
for base in cls.__mro__:
|
||||
init = base.__dict__.get('__init__', _no_init)
|
||||
if init != _no_init:
|
||||
cls.__init__ = init
|
||||
break
|
||||
else:
|
||||
# should not happen
|
||||
cls.__init__ = object.__init__
|
||||
return
|
||||
|
||||
# ... otherwise check consistency of bases, and prohibit instantiation.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue