簡體   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