首页 > 解决方案 > 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)

尽管这可行,但由于以下原因,我并不真正满意:

所以,我的问题是:我们如何构建一个类,其方法以主题方式组织(例如绘图、分析等),就像我的示例中那样,但不必传递参数。非常感谢。

标签: pythonpython-3.xclassoopinner-classes

解决方案


这个想法是您使用有关投资组合的信息创建实例化类:

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()

推荐阅读