Использование общего класса в Python для нескольких файлов

#python #class #oop

#python #класс #ооп

Вопрос:

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

Этот класс получает свои атрибуты от щелчков по холсту tkinter.

 class Algo: 
    def __init__(self, x, y): 
        self.x = x 
        self.y = y 


def callback(event):
    x, y = event.x, event.y
    return (Point(x, y))
    
  

В настоящее время у меня есть один алгоритм, использующий этот класс.
Я планирую добавить больше алгоритмов в другие файлы с тем же атрибутом Point.

  1. Есть ли способ сделать эти атрибуты общими для разных классов в разных файлах?
  2. Лучше ли просто создать один класс в отдельном файле и не использовать ООП для других файлов, передавая атрибуты функциям?

Комментарии:

1. Независимо от того, разделяете ли вы конструкции между разными модулями и используете ли ООП, это две разные проблемы. Я бы определил класс (или namedtuple или dataclass) для Point и импортировал его в несколько модулей… В основном, если у вас есть Point = collections.namedtuple("Point", ["x", "y"]) (например) в файле с именем descartes.py you can do from descartes import Point , и вы поймете суть.

Ответ №1:

Что касается вопроса 1, часть a: «Есть ли способ сделать эти атрибуты общими для разных классов», это просто простое наследование, проиллюстрированное ниже.

Поскольку вы обеспокоены тем, что ваши классы находятся в разных файлах:

  1. Обратите внимание, во-первых, что в Python нет ничего, что требовало бы 1 класса для каждого файла.
  2. См. Комментарий кодзиро.
  3. В общем, доступ к файлам между файлами осуществляется путем их импорта.
  4. Если вы хотите наследовать от класса, определенного в другом месте, импортируйте класс. Если вы хотите использовать функцию, определенную в другом месте, импортируйте функцию. Однако импорт должен иметь значение 0 для вопроса о том, используете ли вы классы или нет.

c

 class Pointed:
    def __init__(self, x, y):
        self.x=x
        self.y=y
     
class Algo(Pointed):
    def __init__(self, x, y, something_else):
        super().__init__(x, y)
        self.something_else = something_else
     
algo = Algo(3, 4, "hello world")
print(algo.x)
print(algo.y)
print(algo.something_else)