访问类嵌套属性的有效方法

2024-10-03 19:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有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\u function()那样访问它,但是它似乎不正确,因为重复了attr0.attr1。。。属性

简而言之,这个实现的概念是一个主机有一个巴哈维奥,它定义了他应该在什么时候连接到服务器。你知道吗

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

已日期的有一个计划,其中包含一个已日期的实例所拥有的时间,因此应该连接主机的时间。 最后,PeriodController根据其正常行为控制主机是否连接,因此PeriodController需要访问自身属性3你知道吗


Tags: selfhostinitexampledef时间classschedule
2条回答

虽然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

这应该在任何类之外定义。你知道吗

用法: ^在本例中,{}将是X5()的实例,differenceInX将是5-2=3。你知道吗

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

可以使用递归:

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>

相关问题 更多 >