Как повторно использовать (статическую) функцию между двумя классами

#python #python-3.x #class #inheritance #static-methods

Вопрос:

Я хочу повторно использовать функцию в двух классах.

Функция не принимает никаких параметров, связанных с классом ( т. е. self не доступен).

Из-за его независимости я хочу вывести его за рамки определения класса, чтобы сделать его доступным для «использования в будущем». «Использование в будущем» в основном происходит в аналогичных классах, таких как класс C().

Я также хочу знать, как мне следует структурировать код, если «будущие использования» будут происходить по всему проекту.

У нас есть следующая структура:

 Class A(): # in file class_a.py
    def static_func(pose1, pose2):
        pass

Class B(): # in another python file called class_b.py
    def static_func(pose1, pose2):
        """
        the same function as in class A
        """
        pass
Class C(): # future usage
    # want to use the static_func as well
 

Каков наилучший способ повторного использования «static_func» в двух классах?

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

1. Это не статический метод. Это просто неправильно определенный метод экземпляра. Классы не предназначены для наследования друг от друга? Если бы это были статические методы, то просто позвоните A.static_func B.static_func … Обратите внимание, что статические методы не очень полезны в Python. Почему бы вам просто не использовать обычную функцию? Кроме того, вам, вероятно, не следует создавать такие модули, как class_x.py … модули python не предназначены для простого хранения одного класса (обычно). Python != Java

2. Почему бы не экспортировать «static_fuction» во внешний файл, а затем импортировать его?

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

Ответ №1:

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

Если эта функция является частью общедоступного интерфейса класса, т. Е. вы ожидаете , что это будет делать другой код a = A(); a.static_func() , то используйте миксин:

 class FuncMixin:
    @staticmethod
    def static_func(...):
        ...

class A(FuncMixin):
    ...

class B(FuncMixin):
    ...