#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 != Java2. Почему бы не экспортировать «static_fuction» во внешний файл, а затем импортировать его?
3. Можете ли вы прояснить свою проблему? Если это функция, вам не нужно делать ничего особенного, чтобы использовать ее более чем в одном месте.
Ответ №1:
Если эта функция просто вызывается из самих классов и ей не нужно быть частью открытого интерфейса класса: вообще не делайте ее методом. Просто пусть это будет функция, независимая от любого класса.
Если эта функция является частью общедоступного интерфейса класса, т. Е. вы ожидаете , что это будет делать другой код a = A(); a.static_func()
, то используйте миксин:
class FuncMixin:
@staticmethod
def static_func(...):
...
class A(FuncMixin):
...
class B(FuncMixin):
...