【发布时间】:2017-01-09 11:22:33
【问题描述】:
在尝试构建一个科学的 Python 包时,我的目标是将关键功能分离到不同的 .py 文件中以清楚起见。具体来说,将模型的复杂数值计算拆分为一个 python 文件(例如,“processing.py”)并将其可视化的例程绘制到另一个 python 文件(“plotting.py”)中,这对我来说似乎是合乎逻辑的。
为了方便和节省内存使用,模型类应该能够继承所有绘图方法,使用户可以轻松访问它们,同时通过将科学数字代码与可视化代码分开来保持代码易于维护和阅读。
我在下面概述了实现这一目标的愿景,但我正在努力解决如何在 Python 中实现这一目标/如果有更好的 OOP 样式可用。
例如在plotting.py中:
class ItemPlotter(object):
def visualisation_routine1(self):
plt.plot(self.values) # where values are to be acquired from the class in processing.py somehow
在 processing.py 中:
class Item(object):
def __init__(self, flag):
if flag is True:
self.values = (1, 2, 3)
else:
self.values = (10, 5, 0)
from plotting.py import ItemPlotter
self.plots = ItemPlotter()
导致以下命令行用法:
from processing.py import Item
my_item = Item(flag=True)
# Plot results
my_item.plots.visualisation_routine1()
我的实际代码会比这更复杂,并且可能 Item 将具有大型数据集的属性,因此我希望我需要避免复制这些以提高内存效率。
请问我的设想是否可行,或者甚至是 Pythonic 方法? 任何 cmets 重新。将不胜感激 OOP 或实现此目标的有效方法。
PS,我的目标是兼容 Py2.7 和 Py3。
【问题讨论】:
-
这既不是继承也不是子类化,这是组合。是的,使用其他地方的类的实例作为属性很好,但您仍然应该将导入放在文件的顶部。
-
您能提供一个工作示例吗?当我尝试这个时,我得到 AttributeError: 'ItemPlotter' 对象没有属性 'vales'。感谢您的帮助。
-
嗯...是的,没错,它没有。因为,再次,你没有子类化。您有一个
ItemPlotter实例在您的Item实例中,但它们不是同一个对象(它们不共享self)。也许Item应该继承自ItemPlotter,反之亦然。 -
或者,您可以在实例化 ItemPlotter 或调用
visualisation_routine1时传递 Item 的实例(即self)。 -
还要注意创建例如
self.plotter = ItemPlotter(self.values)实际上并没有复制 值,它只是意味着两个实例共享对同一个对象的引用。但是,如果您希望ItemPlotter成为“混合类”,则需要Item来继承它。
标签: python class oop inheritance