考虑到我们有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
答案 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
)。