如何在从同一父类扩展的类中获取属性



我定义了几个类

class Animal:
def do_parent_method():
pass
class Monkey(Animal):
pass

class Elephant(Animal):
pass

@dataclass
class Zoo:
monkey: Monkey= Monkey()
elephant: Elephant = Elephant()
start_time: datetime = None
name: str = 'Not important at all'
def data_format(self):
items = [self.monkey, self.elephant]  # Now I hard code here
for item in items:
do_something()

关键点是关于如何在Zoo类中获取属性

也许有一天,我们会在代码中添加另一种动物

@dataclass
class Zoo:
monkey: Monkey= Monkey()
elephant: Elephant = Elephant()
start_time: datetime = None
name: str = 'Not important at all'
def data_format(self):
items = [get the attributes that extends from Animal]  # How to do?
for item in items:
do_parent_method()

现在我只想items成为一个列表,这样我就可以循环它。

或者如果你有另一个好主意对我也有好处。

注意:

Zoom 类中的所有属性将只有一些 str、datetime、int 类型。所有其他实例将是动物类的子类。

固定:

不小心将"动物园"输入到"缩放">

dataclasses.fields函数可以返回有关类的字段信息,包括每个字段的名称和类型。所以你的list理解可以写出来:

items = [getattr(self, field.name) for field in fields(self) if issubclass(field.type, Animal)]

这里的缺陷是它不适用于字符串注释,其中包括模块使用from __future__ import annotations的所有情况。您可以使用此处的技巧解析为实际类型,或者您可以无条件地获取所有字段,然后使用isinstance检查(验证运行时类型,而不是可以在运行时随意忽略的注释类型(过滤它们:

items = [attr for attr in (getattr(self, field.name) for field in fields(self)) if isinstance(attr, Animal)]

最新更新