#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. нет, когда я сделал это по-твоему, ошибки не было. Спасибо вам за объяснение.