首页 > 解决方案 > 访问类嵌套属性的有效方法

问题描述

假设我们有 5 个 python 类 X1、X2、X3、X4、X5 和以下代码:

class Schedule:
    def __init__(self):
        pass

class DateBound:
    def __init__(self):
        self.attr3 = Schedule()


class Behavior:
    def __init__(self):
        self.attr2 = DateBound()


class Host:
    def __init__(self):
        self.attr1 = Behavior()

class PeriodController:
    def __init__(self):
        self.attr0 = Host()

现在假设 PeriodController 中的一个函数需要访问类DateBound的 attr3 :

class PeriodController:
    def __init__(self):
        self.attr0 = ()

    def example_function(self):
        return self.attr0.attr1.attr2.attr3

在这种情况下,我将如何有效地访问attr3 ?我不反对像example_function()那样访问它,但由于attr0.attr1 ... attrn的重复,它似乎不正确

简而言之,这个实现的概念是主机有一个Bahavior,其中定义了他应该在什么时候连接到服务器。

DateBound存在,因为有时主机可以在与其正常行为时间不同的时间连接到服务器,但它确实是好的主机,因此没有使用Datebound实例指定主机的常规连接时间。

DateBound有一个Schedule,其中包含DateBound实例的时间,因此主机应该连接的时间。最后是PeriodController,控制Host是否按照其正常的Behavior连接,因此PeriodController需要访问 self.attr3

标签: pythonclassnested-attributes

解决方案


尽管 Ajax 击败了我,但我正在研究一个更漂亮的解决方案:

def examplefunction(startObject, differenceInX):
    for _ in range(differenceInX + 1):
        startObject = getattr(startObject, (any(item.startswith('attr') for item in dir(startObject))[0])
    return startObject

这应该在任何类之外定义。

用法: 在这种情况下startObject是 的一个实例,并且是 5 - 2 = 3。X5()differenceInX

这种方法的好处是它可以用于任何类,而不必重复定义它。请注意,依赖于每个类(any(item.startswith('attr') for item in dir(startObject))[0])只有一个以开头的属性(在本例中为)。'attr'attr0/1/2/3/n


推荐阅读