访问类嵌套attrbibutes的有效方法

时间:2018-06-07 20:09:30

标签: python class nested-attributes

考虑到我们有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

,它似乎不对

简而言之,此实施的概念是主机具有行为,其中定义了他应该何时连接到服务器。

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

DateBound 日程,其中包含 DateBound 实例的时间,因此主机应该连接。 最后 PeriodController ,控制主机是否根据其正常的行为进行连接,因此 PeriodController 需要访问自己.attr3

2 个答案:

答案 0 :(得分:1)

您可以使用递归:

class X5:
  def __init__(self):
    self.attr0 = X4()
  def example_function(self, count = 1):
    if count == 4:
      return self.attr0
    self.attr0 = getattr(self.attr0, f'attr{count}')
    return self.example_function(count+1)

print(X5().example_function())

输出:

<__main__.X1 object at 0x1012cc278>

打印X5().attr0.attr1.attr2.attr3)可获得相同的结果:

<__main__.X1 object at 0x1012cc278>

为每个类添加__repr__方法可以更轻松地进行可视化:

class X1:
  ...
  def __repr__(self):
    return f'<{self.__class__.__name__}>'

print(X5().example_function())

输出:

<X1>

答案 1 :(得分:1)

虽然阿贾克斯打败了我,但我正在研究一个更为狡猾的解决方案:

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将是X5()的实例,differenceInX将是5 - 2 = 3。

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