Питонический путь подклассов Python - PullRequest
0 голосов
/ 29 апреля 2018

Я хотел бы организовать свой код таким образом, чтобы я мог определять методы, которые можно классифицировать в зависимости от их назначения. Мои решения используют подклассы следующим образом:

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'). Кажется, это не очень питонично, так как я вызываю метод из 'pf'. Таким образом, я в основном получаю доступ к 'pf' дважды.
  • Мой настоящий код намного длиннее, и этот подход потребовал бы от меня записи каждой строки кода в классе 'Portfolio' и, следовательно, в одном файле. Слишком сложно ориентироваться.

Итак, мой самый вопрос: как мы можем построить класс с методами, которые организованы тематически (например, построение графиков, анализ и т. Д.), Как в моем примере, но без необходимости передавать аргументы. Большое спасибо.

1 Ответ

0 голосов
/ 29 апреля 2018

Идея состоит в том, что вы создаете экземпляр класса с информацией о портфеле:

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