python 中数据类的最佳泛型类型提示是什么?
What is the best generic type hint for a dataclass in python?
我已经开始使用数据classes,我有一些具体的数据,例如:
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
job:str
@dataclass
class Animal:
name: str
age: int
然后我有一个像接口一样的抽象class
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
我可以在摘要中使用什么好的通用类型提示 class 作为 Person 和 Animal classes 的占位符?
您可以定义一个协议 class,它只声明 name
属性的存在。
from typing import Protocol
class Named(Protocol):
name: str
class NameFinder:
@staticmethod
def get_name(obj: Named) -> str:
return obj.name
# or ...
def name_finder(obj: Named) -> str:
return obj.name
get_name
和 name_finder
都可以接受 Person
或 Animal
类型的参数,因为 class 都定义了 name
属性对于他们的例子。没有必要将 classes 显式标记为实现 Named
协议。
我已经开始使用数据classes,我有一些具体的数据,例如:
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
job:str
@dataclass
class Animal:
name: str
age: int
然后我有一个像接口一样的抽象class
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
我可以在摘要中使用什么好的通用类型提示 class 作为 Person 和 Animal classes 的占位符?
您可以定义一个协议 class,它只声明 name
属性的存在。
from typing import Protocol
class Named(Protocol):
name: str
class NameFinder:
@staticmethod
def get_name(obj: Named) -> str:
return obj.name
# or ...
def name_finder(obj: Named) -> str:
return obj.name
get_name
和 name_finder
都可以接受 Person
或 Animal
类型的参数,因为 class 都定义了 name
属性对于他们的例子。没有必要将 classes 显式标记为实现 Named
协议。