如何获取 class 中从同一父 class 扩展的属性
How to get attributes in class that extends from the same parent class
有几个class是我定义的
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
class
中的属性
也许有一天,我们会在我们的代码中添加另一种动物
@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中的所有属性class只会有一些str, datetime, int类型。所有其他实例将是 Animal class.
的子 class
固定:
不小心将 'zoo' 输入到 'zoom'
The dataclasses.fields
function 可以 return 关于 class 的字段信息,包括每个字段的名称和类型。所以你的list
理解可以写成:
items = [getattr(self, field.name) for field in fields(self) if issubclass(field.type, Animal)]
这里的缺陷是它不适用于字符串注释,这包括模块使用 from __future__ import annotations
的所有情况。您可以使用技巧 here 解析为实际类型,或者您可以无条件地获取所有字段,然后使用 isinstance
检查过滤它们(验证运行时类型,而不是可以注释的类型在运行时被愉快地忽略):
items = [attr for attr in (getattr(self, field.name) for field in fields(self)) if isinstance(attr, Animal)]
有几个class是我定义的
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
class
也许有一天,我们会在我们的代码中添加另一种动物
@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中的所有属性class只会有一些str, datetime, int类型。所有其他实例将是 Animal class.
的子 class固定:
不小心将 'zoo' 输入到 'zoom'
The dataclasses.fields
function 可以 return 关于 class 的字段信息,包括每个字段的名称和类型。所以你的list
理解可以写成:
items = [getattr(self, field.name) for field in fields(self) if issubclass(field.type, Animal)]
这里的缺陷是它不适用于字符串注释,这包括模块使用 from __future__ import annotations
的所有情况。您可以使用技巧 here 解析为实际类型,或者您可以无条件地获取所有字段,然后使用 isinstance
检查过滤它们(验证运行时类型,而不是可以注释的类型在运行时被愉快地忽略):
items = [attr for attr in (getattr(self, field.name) for field in fields(self)) if isinstance(attr, Animal)]