繁体   English   中英

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

[英]How to get attributes in class that extends from the same parent 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类中如何获取属性

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

@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 类型。 所有其他实例将是 Animal 类的子类。

固定的:

不小心把'zoo'进'zoom'

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)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM