【发布时间】:2022-01-18 05:25:17
【问题描述】:
我已经开始使用数据类,并且我有一些特定的,例如:
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
job:str
@dataclass
class Animal:
name: str
age: int
然后我有一个像接口这样的抽象类
import abc
from typing import List, Dict
class NameFinder:
@abc.abstractmethod
def get_name(self, name: str,being ) :
pass
class PersonName(NameFinder):
def get_name(self, name:str, person:Person):
return person.name
class AnimalName(NameFinder):
def get_name(self, name:str, animal:Animal):
return animal.name
什么是可以在抽象类中用作 Person 和 Animal 类的占位符的好的泛型类型提示?
【问题讨论】:
-
据我所知,这个问题确实与数据类无关。似乎是一个红鲱鱼。在任何情况下,您可能都可以使用绑定的 TypeVar
T = TypeVar(T, Animal, Person), -
也许你想要一个协议类来断言接收到的类同时具有
name和age属性。 -
NameFinder没有理由成为一个类,但是:get_name最坏的情况是可以作为静态方法,并且像大多数静态方法一样,可能可以作为常规函数来实现。 -
@juanpa.arrivillaga 我认为这可能与它有关,因为数据类包装器可以提供一个我不知道的基类。这就是我问的原因。
-
如果您要添加第三个类(如
Vegetable),您还必须更新 typevar。使用协议,Vegetable会自动包含为协议的“子类”,这仅仅是因为具有name属性。有许多其他语言必须使用继承来实现,而在 Python 中无需继承就可以做到;这是其中之一。
标签: python abstract-class python-dataclasses