У меня есть класс только с методами класса. Это Pythonic способ пространства имен? Если нет, то как лучше всего сгруппировать похожие методы?
class OnlyClassMethods(object):
@classmethod
def method_1(cls):
pass
@classmethod
def method_2(cls):
pass
Вопрос не очень точный. Почему бы вам использовать только classmethods? Если вы пытаетесь создать класс через класс, я рекомендую вам взглянуть на meta classes: stackoverflow.com/questions/100003/…
@DeepSpace Если вы используете только методы класса, то все, что вам нужно, это изменить методы экземпляра или атрибуты класса. У меня была аналогичная проблема, когда мне нужно было генерировать разные классы в соответствии с разными параметрами, и (плохой) способ сделать это - сначала создать экземпляр, а затем использовать методы классов для замены некоторых поведений. Во всяком случае, я сделал вывод, что это вариант использования ОП, хотя я не уверен, поэтому я начинаю свой комментарий с «вопрос не очень точен».






Класс должен иметь экземпляры, а не служить пространством имен. Если ваш класс никогда не создавался, он не обслуживает предполагаемая цель Python class.
Если вы хотите создать пространство имен для группы связанных методов, создайте новый файл модуль, то есть еще один файл .py, и импортируйте его.
Здесь мы создаем модуль с именем helpers, который содержит несколько связанных методов. Затем этот модуль можно импортировать в наш файл main.
def method_1():
...
def method_2():
...
import helpers
helpers.method_1()
helpers.method_2()
Действительно ответил на мой вопрос. Спасибо
Как бы вы перевели подклассы и наследование в модульный подход?
@Hyperplane Если вам нужно больше методов, вы можете просто импортировать два модуля. В противном случае, если вы хотите изменить модуль с каким-либо методом, вы можете сделать from module import * во втором модуле и затенить некоторые методы своими собственными.
Я не совсем это понимаю. Методы класса могут использовать атрибуты класса и другие методы класса. Допустим, у меня есть класс: class A, у которого есть свойство класса: def data_dir(cls): return BASEPATH.joinpath(cls.__name__)) которое задает каталог, в котором класс может хранить некоторые данные, и некоторый метод класса def store_cls_data(cls), который сбрасывает данные, относящиеся к классу, в cls.data_dir. Тогда давайте создадим подкласс class B(A), который по наследству тоже может использовать эти методы. Если бы мне пришлось перевести это в модули, как бы вы справились с методами класса, получающими доступ к атрибутам класса?
@Hyperplane Я бы сказал, что если вам В самом деле нужно наследование, то используйте класс, потому что модули не предложат вам эту функцию.
На данный момент этот вопрос слишком широк, поскольку контекст отсутствует. Например, если между этими методами нет общего состояния, то может иметь смысл использовать «пространство имен» с помощью функций верхнего уровня.