From bb36995b365492c0bb1bbf1681a016acf15feef3 Mon Sep 17 00:00:00 2001 From: Jonathan Amponsah <82057176+mgalore@users.noreply.github.com> Date: Fri, 31 Jul 2026 18:15:01 +0000 Subject: [PATCH] fix: exclude __class__ from protocol members Fixes #21795. --- mypy/nodes.py | 1 + test-data/unit/check-overloading.test | 39 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/mypy/nodes.py b/mypy/nodes.py index e2ea348d2df11..66f6d842ac555 100644 --- a/mypy/nodes.py +++ b/mypy/nodes.py @@ -3595,6 +3595,7 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T: { "__abstractmethods__", "__annotations__", + "__class__", "__dict__", "__doc__", "__init__", diff --git a/test-data/unit/check-overloading.test b/test-data/unit/check-overloading.test index 721ca52f59eed..b377cc1e15788 100644 --- a/test-data/unit/check-overloading.test +++ b/test-data/unit/check-overloading.test @@ -6856,3 +6856,42 @@ if isinstance(headers, dict): reveal_type(headers) # N: Revealed type is "__main__.Headers | typing.Iterable[tuple[builtins.bytes, builtins.bytes]]" [builtins fixtures/isinstancelist.pyi] + +[case testOverloadProtocolClassPropertyDoesNotEraseListItemType] +from collections.abc import Iterator, Sequence +from typing import Any, Protocol, TypeVar, overload + +T_co = TypeVar("T_co", covariant=True) + +class ReducedCovariantList(Protocol[T_co]): + @property + def __class__(self) -> type[list[Any]]: ... + def __iter__(self) -> Iterator[T_co]: ... + +@overload +def f(x: ReducedCovariantList[str]) -> str: ... +@overload +def f(x: Sequence[int]) -> int: ... +def f(x: object) -> object: ... + +reveal_type(f([1])) # N: Revealed type is "builtins.int" +[file builtins.py] +from typing import Generic, Self, TypeVar +from collections.abc import Iterator, Sequence + +class object: + @property + def __class__(self) -> type[Self]: pass +class type: pass +class function: pass +class property: pass +class int: pass +class str: pass +class bool: pass +class dict: pass +class ellipsis: pass +class tuple: pass + +T = TypeVar("T") +class list(Sequence[T], Generic[T]): + def __iter__(self) -> Iterator[T]: pass