Предупреждение: «Ожидаемый тип» Тип[Родительский класс]», вместо этого получил «Дочерний класс»», когда тип указан как тип[Родительский класс]

#python #python-3.x

#питон #python-3.x

Вопрос:

Не могли бы вы объяснить, пожалуйста, почему PyCharm выдает мне предупреждение Expected type 'Type[BaseObject]', got 'LongObject' instead , когда я передаю экземпляр подкласса родительского класса с типом в функцию?

Я использую Python 3.9, Pycharm 2021.2.3

Код находится здесь:

 from dataclasses import dataclass from typing import Type   @dataclass class BaseObject:  name: str  color: str   @dataclass class LongObject(BaseObject):  length: int   @dataclass class WideObject(BaseObject):  width: int   def print_object_name(obj: Type[BaseObject]):  print(obj.name)   long_thing = LongObject(name='LONG', color='RED', length=42) print_object_name(long_thing)  wide_thing = WideObject(name='LONG', color='RED', width=88) print_object_name(wide_thing)  

Ответ №1:

Ваша аннотация типа здесь неверна:

 def print_object_name(obj: Type[BaseObject]):  print(obj.name)  

Чтобы аннотировать obj как экземпляр типа BaseObject , просто сделайте:

 def print_object_name(obj: BaseObject):  print(obj.name)  

Type Тип используется, когда объект сам по себе является типом, а не экземпляром этого типа, например, если вы должны были сделать:

 print_object_name(LongObject)  

аргумент будет иметь тип Type[LongObject] , который является подтипом Type[BaseObject] точно так же, как LongObject является подтипом BaseObject .

Комментарии:

1. Но как я должен четко указать в типе, что функция может принимать не только экземпляр родительского класса, но и экземпляры дочернего класса?

2. Если ChildClass это ребенок ParentClass , то все, что вам нужно сделать, это прокомментировать его как ParentClass , и он ChildClass также примет. Именно так работает наследование. В вашем примере аннотирование obj как BaseObject разрешает аргументы любого BaseObject типа, включая LongObject и WideObject . Вы получили ошибку, когда попытались прокомментировать это таким образом?

3. нет, когда я сделал это по-твоему, ошибки не было. Спасибо вам за объяснение.