如何解决通过引用复制python属性
我有一个棘手的 python 结构问题,我无法完全理解。
读取大文件正在从我们的应用程序代码中提取出来并放入它自己的包中。它曾经是一个类,我们称之为 Object
,将用于访问文件属性,并在我们的 Application
中传递。所以 Application
包会调用 Object.datetime
,但现在必须调用 Object.file_handler.datetime
。所以我有几个选择:
-
对于
FileHandler
中的每个属性,在Object
中创建一个仅引用file_handler
对象的属性。所以在Object
中:@property def datetime(self): return self.file_handler.datetime
这看起来很恶心,因为有几十个属性/函数,而且耦合度非常高。这是我们目前的解决方案。
-
找到一种自动复制这些函数/属性的方法。类似的东西:
for property in self.file_handler: create self.property with value self.file_handler.property
由于文件的大小,这必须是引用而不是内存副本。
-
检查应用程序并将对
self.object.property
的每次调用替换为self.object.file_handler.property
。由于Application
是生产级代码,这是一个很大的问题。它可能会破坏我们有一段时间没有触及的其他东西(单元测试存在,但它们不是很好)。 -
重组一切。
FileHandler
必须在不同的包中,我不想将该功能复制/粘贴到Application
中。我不能让Object
扩展FileHandler
因为Object
在某个时间代表FileHandler
(这让我很头疼;基本上Object
是一个 {{ 1}} 实例,并且每个Application
对象运行多个Application
;FileHandler
对象通过迭代器传递给FileHandler
)。我需要Application
因为Object
无法实现FileHandler
功能 - 它们首先应该是两个类。如果有人对此感兴趣,请告诉我,我可以提供更多结构细节,但我倾向于采用一次性解决方案。
这是一个我似乎无法破解的软件设计问题。我承认我们的代码很脆弱,没有经过很好的设计/测试,但它就是这样(大部分代码比我早,而且这不是一个软件工程团队——主要是数学/物理人员)。有人有指导吗?选项 2 是我最喜欢的,但我找不到使其工作的代码。
解决方法
对于在 self.file_handler
上找不到的属性,您可以定义 Object.__getattr__()
以将属性访问权限委托给 self
。
例如:
class FileHandler:
def __init__(self,filename):
self.filename = filename
class Object:
def __init__(self,file_handler):
self.file_handler = file_handler
self.x = 'foobar'
def __getattr__(self,name):
return getattr(self.file_handler,name)
f = FileHandler('some_file')
obj = Object(f)
print(obj.x) # -> foobar
print(obj.filename) # -> some_file
print(obj.y) # -> AttributeError: 'FileHandler' object has no attribute 'y'
有关更多详细信息,请参阅上面的文档链接。
感谢 juanpa.arrivillaga 在 a comment 中提出这个建议。
我可能还会添加一些处理以使异常消息更清晰,如下所示:
def __getattr__(self,name):
try:
return getattr(self.file_handler,name)
except AttributeError:
# Provide a clearer exception message.
cls = type(self).__name__
fh = type(self.file_handler).__name__
msg = f'Both {cls!r} object and {fh!r} object have no attribute {name!r}'
raise AttributeError(msg) from None
...
print(obj.y)
# AttributeError: Both 'Object' object and 'FileHandler' object have no attribute 'y'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。