PythonPython 子类的 ic 方式
Pythonic way of Python subclasses
我想以一种允许我定义可根据用途分类的方法的方式组织我的代码。我的解决方案按以下方式使用 subclasses:
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' 两次。
- 我的实际代码要长得多,这种方法需要我在 'Portfolio' class 中编写每一行代码,因此在一个文件中。太难导航了。
所以,我的问题是:我们如何构建一个 class,使用以主题方式组织的方法(例如绘图、分析等),就像在我的示例中一样,但不必传递参数.非常感谢。
我们的想法是,您使用有关投资组合的信息创建实例化 class:
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()
我想以一种允许我定义可根据用途分类的方法的方式组织我的代码。我的解决方案按以下方式使用 subclasses:
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' 两次。
- 我的实际代码要长得多,这种方法需要我在 'Portfolio' class 中编写每一行代码,因此在一个文件中。太难导航了。
所以,我的问题是:我们如何构建一个 class,使用以主题方式组织的方法(例如绘图、分析等),就像在我的示例中一样,但不必传递参数.非常感谢。
我们的想法是,您使用有关投资组合的信息创建实例化 class:
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()