by Anonymous » 19 May 2025, 08:57
Ich habe eine abstrakte Basisklasse: < /p>
Code: Select all
import abc
import typing as t
class Parent1(abc.ABC):
...
< /code>
und eine Unterklasse dieser abstrakten Basisklasse, das selbst eine abstrakte Basisklasse ist: < /p>
class Parent2(Parent1):
@abc.abstractmethod
def method2(self) -> None:
...
Und jetzt eine konkrete untergeordnete Klasse, die von parent2 abstrakte Klasse erbt:
Code: Select all
class Child1(Parent2):
def method2(self) -> None:
pass
und eine andere konkrete untergeordnete Klasse, die von Parent1 Klasse erbt:
Jetzt versuche ich, einen generischen Container zu erstellen, der alle Instanzen von Parent1 Klasse
enthält
Code: Select all
T = t.TypeVar("T")
class Container(t.Generic[T]):
def __init__(self) -> None:
self._containers: t.Dict[str, T] = {}
def add_item(self, name: str, item: T) -> None:
# reveal_type(item)
self._containers[name] = item
def get_item(self, name: str) -> T:
return self._containers[name]
< /code>
container: Container[Parent1] = Container()
container.add_item("child1", Child1())
container.add_item("child2", Child2())
< /code>
child1 = container.get_item("child1")
# assert isinstance(child1, Child1)
# reveal_type(child1) # Revealed type is "generic1.Parent1"
child1.method2()
# t.cast(Child1, child1).method2()
< /code>
When trying to run mypy --strict
ohne Assert isInstance oder gegossen meldet einen Fehler, der besagt, dass
Code: Select all
error: "Parent1" has no attribute "method2"
So beheben Sie das
Problem ohne Verwendung von Assert ISInstance oder typing.cast oder auch ohne den # Typ: Ignore Kommentar?
Ich habe eine abstrakte Basisklasse: < /p>
[code]import abc
import typing as t
class Parent1(abc.ABC):
...
< /code>
und eine Unterklasse dieser abstrakten Basisklasse, das selbst eine abstrakte Basisklasse ist: < /p>
class Parent2(Parent1):
@abc.abstractmethod
def method2(self) -> None:
...
[/code]
Und jetzt eine konkrete untergeordnete Klasse, die von parent2 abstrakte Klasse erbt:
[code]class Child1(Parent2):
def method2(self) -> None:
pass
[/code]
und eine andere konkrete untergeordnete Klasse, die von Parent1 Klasse erbt:
[code]class Child2(Parent1):
pass
[/code]
Jetzt versuche ich, einen generischen Container zu erstellen, der alle Instanzen von Parent1 Klasse
enthält[code]T = t.TypeVar("T")
class Container(t.Generic[T]):
def __init__(self) -> None:
self._containers: t.Dict[str, T] = {}
def add_item(self, name: str, item: T) -> None:
# reveal_type(item)
self._containers[name] = item
def get_item(self, name: str) -> T:
return self._containers[name]
< /code>
container: Container[Parent1] = Container()
container.add_item("child1", Child1())
container.add_item("child2", Child2())
< /code>
child1 = container.get_item("child1")
# assert isinstance(child1, Child1)
# reveal_type(child1) # Revealed type is "generic1.Parent1"
child1.method2()
# t.cast(Child1, child1).method2()
< /code>
When trying to run mypy --strict[/code] ohne Assert isInstance oder gegossen meldet einen Fehler, der besagt, dass
[code]error: "Parent1" has no attribute "method2"[/code]
So beheben Sie das [url=viewtopic.php?t=20324]Problem[/url] ohne Verwendung von Assert ISInstance oder typing.cast oder auch ohne den # Typ: Ignore Kommentar?