python - Python 子类的 Pythonic 方式
问题描述
我想以一种允许我定义可以根据其用途分类的方法的方式组织我的代码。我的解决方案以下列方式使用子类:
import matplotlib.pyplot as plt
class Portfolio:
def __init__(self):
self.x = [1,2,3]
self.y = [4,6,2]
class Plotting:
def red(x_value,y_value):
plt.scatter(x=x_value,y=y_value,color="red")
plt.show()
def green(x_value,y_value):
plt.scatter(x=x_value,y=y_value,color="green")
plt.show()
class Analysis:
def min_max_x(x_value):
print([min(x_value),max(x_value)])
def min_max_y(y_value):
print([min(y_value), max(y_value)])
# Creates Portfolio object
pf = Portfolio()
# Plotting
pf.Plotting.red(x_value=pf.x,y_value=pf.y)
pf.Plotting.green(x_value=pf.x,y_value=pf.y)
# Analysis
pf.Analysis.min_max_x(x_value=pf.x)
pf.Analysis.min_max_y(y_value=pf.y)
尽管这可行,但由于以下原因,我并不真正满意:
- 我必须将参数传递给方法(例如'pf.x')。这似乎不是很pythonic,因为我从'pf'调用该方法。因此我基本上访问'pf'两次。
- 我的实际代码要长得多,这种方法需要我在“投资组合”类中编写每一行代码,因此在一个文件中。太难导航了。
所以,我的问题是:我们如何构建一个类,其方法以主题方式组织(例如绘图、分析等),就像我的示例中那样,但不必传递参数。非常感谢。
解决方案
这个想法是您使用有关投资组合的信息创建实例化类:
import matplotlib.pyplot as plt
class Plotting:
def __init__(self, portfolio):
self.portfolio = portfolio
def red(self):
plt.scatter(x=self.portfolio.x, y=self.portfolio.y, color="red")
plt.show()
def green(self):
plt.scatter(x=self.portfolio.x, y=self.portfolio.y, color="green")
plt.show()
class Analysis:
def __init__(self, portfolio):
self.portfolio = portfolio
def min_max_x(self):
print([min(self.portfolio.x), max(self.portfolio.x)])
def min_max_y(self):
print([min(self.portfolio.y), max(self.portfolio.y)])
class Portfolio:
def __init__(self):
self.x = [1, 2, 3]
self.y = [4, 6, 2]
self.plotting = Plotting(self)
self.analysis = Analysis(self)
# Creates Portfolio object
pf = Portfolio()
# Plotting
pf.plotting.red()
pf.plotting.green()
# Analysis
pf.analysis.min_max_x()
pf.analysis.min_max_y()
推荐阅读
- web-deployment - 是否有任何在线编译器 API,如果我输入源代码,它会在编译时返回结果(或任何错误)?
- javascript - Vue.js Typescript 组件不会更新异步回调的视图
- mysql - 在 MySQL 中实现 where 条件 varchar 字段
- c++ - 位移行为
- oracle - 在oracle中将部分重复的行合并为一个
- ios - 如果在设备平坦 Swift 时加载 VC,则设备的方向会失败
- flutter - Flutter Column with parent Animated 高度溢出问题
- spacy - spacy tokenizer:有没有办法使用正则表达式作为 update_exc 的自定义异常中的键
- c# - Roslyn 代码分析拼写检查器无法识别内插字符串文字中的代码标识符
- xml - 无法在 XSLT 中使用子节点的值