Python子类的Pythonic方式

时间:2018-04-29 17:26:26

标签: python python-3.x class oop inner-classes

我想以一种允许我定义可以根据其目的进行分类的方法来组织我的代码。我的解决方案以下列方式使用子类:

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'中编写每一行代码。类,因此在一个文件中。导航太难了。

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

1 个答案:

答案 0 :(得分:0)

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

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