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_function()那样访问它,但由于attr0.attr1 ... attrn的重复,它似乎不正确
简而言之,这个实现的概念是主机有一个Bahavior,其中定义了他应该在什么时候连接到服务器。
DateBound类存在,因为有时主机可以在与其正常行为时间不同的时间连接到服务器,但它确实是好的主机,因此没有使用Datebound实例指定主机的常规连接时间。
DateBound有一个Schedule,其中包含DateBound实例的时间,因此主机应该连接的时间。最后是PeriodController,控制Host是否按照其正常的Behavior连接,因此PeriodController需要访问 self.attr3
解决方案
尽管 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
推荐阅读
- c# - 在 LINQ 中解构包含 ValueTuple 的容器
- function - Flutter Listview Builder 在单击图标上添加和删除更新数量文本字段
- javascript - webRTC:如何从被叫端更新视频流
- php - 用mysql分两行获取记录
- php - PHP - ZipArchive() 清理权限问题
- c# - 未在视图上显示的特定字段的模型状态错误验证
- php - Twig 如何检查正在渲染的模板
- python - 何时使用 trunc() 而不是 int() 将浮点类型数转换为整数更好?
- sql-server - 如何自动化 SQL Server 查询并将结果自动放入 Excel 文件
- jekyll - 发布时如何让 Jekyll 将网站图标从子目录复制到根目录?