передать аргументы внутри разделенных методов - PullRequest
1 голос
/ 18 марта 2020

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

Моя попытка:

Ниже код работает, но я не знаю если это лучшее / правильное решение.

База:

from calculate_function import function


class Data():
    def __init__(self):
        self.y = -2
        self.x = 1
        self.z, self.result = function(self)

calc_function.py:

def function(self):
    z = 2
    result = z + self.x
    return z, result

Для выше я передаю себя внутри новой функции для сбора всех переменные init, затем определите новую собственную переменную / results.

В разных файлах будет гораздо больше функций, которые будут выполнять некоторые вычисления и создавать новые переменные для экземпляра класса.

Вопрос

Мне нужно передать каждую созданную собственную переменную каждой функции. Для приведенного выше кода решение правильно определено или есть лучший вариант для этого?

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

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

from calculate_function import function


class Data():
    def __init__(self):
        self.y = -2
        self.x = 1
        self.z, self.result = function(self.x)

convert_function.py:

def function(x):
    z = 2
    result = z + x
    return z, result

Суть в том, что 1 / вы можете сразу определить создание атрибутов z и result и 2 / вы можете проверить function() без экземпляра Data.

Мне нужно разделить методы класса на несколько файлов.

Это часто означает, что ваш у класса слишком много обязанностей. Некоторые его части могут быть делегированы чистым функциям, как показано выше. Некоторые другие части, которым требуется доступ к общему подмножеству атрибутов вашего класса, могут быть делегированы другим, более мелким специализированным классам, но предпочтительно с использованием композиции / делегирования вместо наследования (конечно, в зависимости от конкретных случаев использования).

0 голосов
/ 18 марта 2020

Вот решение, использующее наследование классов:

-- function1.py --
class FunctionClass1():
     def function1(self):
             self.result = self.x + self.y

-- function2.py -- 
class FunctionClass2():
     def function2(self):
             self.result = self.result + self.z

-- data.py -- 
from function1 import FunctionClass1
from function2 import FunctionClass2 


class Data(FunctionClass1, FunctionClass2):
     def __init__(self):
             self.x = 1
             self.y = 2
             self.z = 3
             self.function1()
             self.function2()
0 голосов
/ 18 марта 2020

Вам не нужно передавать себя внутри функции. Почему бы не сделать это следующим образом:

class Data():
    def __init__(self):
        self.y = -2
        self.x = 1
        self.function()

    def function(self):
        self.z = 2
        self.result = self.z + self.x

Сделать wi sh, чтобы использовать другую функцию класса или просто отдельную функцию?

...