diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index fa49b90886c302..fb9291fbc4f36a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -1610,6 +1610,14 @@ class P(Protocol): with self.assertRaisesRegex(TypeError, "@runtime_checkable"): isinstance(1, P) + def test_protocol_init_is_forbidden(self): # see bpo-44807 + with self.assertRaisesRegex(TypeError, 'Protocols can not have __init__ method'): + class P(Protocol): + x: int + + def __init__(self, x: int): + self.x = x + def test_super_call_init(self): class P(Protocol): x: int diff --git a/Lib/typing.py b/Lib/typing.py index e29d699283dfec..d7a7d2cd2e8903 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1577,6 +1577,10 @@ def _proto_hook(other): issubclass(base, Generic) and base._is_protocol): raise TypeError('Protocols can only inherit from other' ' protocols, got %r' % base) + + if '__init__' in cls.__dict__: + raise TypeError('Protocols can not have __init__ method') + cls.__init__ = _no_init_or_replace_init diff --git a/Misc/NEWS.d/next/Library/2021-08-02-12-58-14.bpo-44807.UvHEKh.rst b/Misc/NEWS.d/next/Library/2021-08-02-12-58-14.bpo-44807.UvHEKh.rst new file mode 100644 index 00000000000000..19015dc4573822 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-08-02-12-58-14.bpo-44807.UvHEKh.rst @@ -0,0 +1,2 @@ +Forbid to define ``__init__`` method in ``Protocol`` classes. Patch provided +by Yurii Karabas.