Python中文
首页
教程
问答
标签
搜索
登录
注册
最佳实践方法,使两个耦合类中
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我很难用一种原则良好的面向对象的方式组织代码</p> <p><strong>总而言之</strong>:我希望有两个独立的类,每个类实现各自的功能(例如,分别模拟和绘图),但以某种方式将它们结合起来(以可扩展的方式!)让一个实例实现它们的两个功能</p> <p><strong>示例:</strong>假设我有一个生成数据的类</p> <pre><code>class DataSimulator(): def __init__(self, N): self.N = N self.result = None def simulate(self): self.result = range(self.N) #imagine lots of simulation code here </code></pre> <p>我还要绘制我的数据。我可以简单地向<code>DataSimulator</code>添加一个<code>plot()</code>方法,但是</p> <ul> <li>我认为<code>DataPlotter</code>应该是它自己的独立类,因为它的功能与<code>DataSimulator</code>完全不同</李> </ul> <hr/> <p><strong>A.</strong>我想到的一个选项是一个单独的类,它存储一个<code>DataSimulator</code>实例,然后根据需要打印它</p> <pre><code>class DataPlotter(): def __init__(self, data_simulator_instance): self.d = data_simulator_instance def plot(self): plt.plot(self.d.result) #e.g. using matplotlib dataSim = DataSimulator(5) dataPlt = DataPlotter(dataSim) dataSim.simulate() dataPlt.plot() </code></pre> <p>然而,为了使用这种范式</p> <ul> <li>我需要一直跟踪两个单独的紧密耦合的物体。这似乎是个坏习惯。我永远不会没有一个没有另一个,所以我想把它们的功能结合到一个</李> </ul> <hr/> <p><strong>B.</strong>我考虑让<code>DataPlotter</code>从<code>DataSimulator</code>继承如下:</p> <pre><code>class DataPlotter(DataSimulator): def plot(self): plt.plot(self.result) dataPlt = DataPlotter(5) dataPlt.simulate() dataPlt.plot() </code></pre> <p>这很好,因为我现在只有一个实例可以满足我的所有需要,但这似乎仍然是错误的,因为:</p> <ul> <li><code>DataPlotter</code>实例执行模拟例程是令人困惑的</li> <li>如果我写了一个<code>DataSimulatorVersion2</code>,我就不能重复使用我的<code>DataPlotter</code></李> </ul> <hr/> <p>类似地,我也认为<code>DataSimulator</code>继承自<code>DataPlotter</code></p> <pre><code>class DataPlotter(): def plot(self): plt.plot(self.result) class DataSimulator(DataPlotter): def __init__(self, N): self.N = N self.result = None def simulate(self): #lots of simulation code here self.result = range(self.N) dataSim = DataSimulator(5) dataSim.simulate() dataSim.plot() </code></pre> <p>这解决了上面的第一个问题(我认为模拟器可以绘制数据,但绘图仪不能模拟数据),但是现在</p> <ul> <li>如果我写一个<code>DataPlotterVersion2</code>,我就不能重用<code>DataSimulator</code></li> <li>在<code>DataPlotter</code>中使用<code>self.result</code>而不保证变量存在似乎也是不好的做法</李> </ul> <hr/> <p><strong>我的问题:</strong></p> <ol> <li>有解决这个问题的最佳实践方法吗(我在最上面的总结中写的是我真正想要的,还是我应该走一条完全不同的路?)</li> <li>我提出的问题(在要点中)真的有效吗</李> </ol>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>在我看来,我应该像您在第一个实现中提到的那样尽可能简单:两个独立的类。DataPlotter可以绘制任何类型的数据,而不仅仅是DataSimulator,因为python不检查可以传递任何其他对象的类型。唯一的限制是这个对象需要一个适合“plt.plot”函数的“result”属性</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
我想从用户inpu创建一个类的实例
5 回答
我想从用户导入值,为此
5 回答
我想从用户那里得到一个整数输入,然后让for循环遍历该数字,然后调用一个函数多次
9 回答
我想从用户那里收到一个列表,并在其中执行一些步骤,然后在步骤完成后将其打印回来,但它没有按照我想要的方式工作
8 回答
我想从用户那里获取输入,并将值传递给(average=dict[x]/6),然后在那里获取resu
8 回答
我想从第一个列表中展示第一个词,然后从第二个列表中展示十个词,以此类推- Python
7 回答
我想从第一个空lin开始解析文本文件
10 回答
我想从简历、简历中提取特定部分
9 回答
我想从给定字典(python)的字符串中删除\u00a9、\u201d和类似的字符。
1 回答
我想从给定的网站Lin下载许多文件扩展名相同的Wget或Python文件
6 回答
我想从网上搜集一些关于抵押贷款的数据
7 回答
我想从网站上删除电子邮件地址
9 回答
我想从网站上读取数据该网站包含可下载的文件,然后我想用python脚本把它发送给oracle如何?
1 回答
我想从网站中提取数据,然后将其显示在我的网页上
6 回答
我想从网页上提取统计数据。
8 回答
我想从网页上解析首都城市,并在用户输入国家时在终端上打印它们
2 回答
我想从色彩图中删除前n个颜色,而不丢失原始颜色数
1 回答
我想从课堂上打印字典里的键
5 回答
我想从费用表中获取学生上次支付的费用,其中学生id=id
6 回答
我想从较低的顺序对多重列表进行排序,但我无法在一行中生成结果
9 回答