Класс только с методами класса

У меня есть класс только с методами класса. Это Pythonic способ пространства имен? Если нет, то как лучше всего сгруппировать похожие методы?

class OnlyClassMethods(object):
    @classmethod
    def method_1(cls):
        pass

    @classmethod
    def method_2(cls):
        pass

На данный момент этот вопрос слишком широк, поскольку контекст отсутствует. Например, если между этими методами нет общего состояния, то может иметь смысл использовать «пространство имен» с помощью функций верхнего уровня.

DeepSpace 12.02.2019 22:16

Вопрос не очень точный. Почему бы вам использовать только classmethods? Если вы пытаетесь создать класс через класс, я рекомендую вам взглянуть на meta classes: stackoverflow.com/questions/100003/…

madjaoue 12.02.2019 22:18

@DeepSpace Если вы используете только методы класса, то все, что вам нужно, это изменить методы экземпляра или атрибуты класса. У меня была аналогичная проблема, когда мне нужно было генерировать разные классы в соответствии с разными параметрами, и (плохой) способ сделать это - сначала создать экземпляр, а затем использовать методы классов для замены некоторых поведений. Во всяком случае, я сделал вывод, что это вариант использования ОП, хотя я не уверен, поэтому я начинаю свой комментарий с «вопрос не очень точен».

madjaoue 12.02.2019 22:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
3
4 062
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Класс должен иметь экземпляры, а не служить пространством имен. Если ваш класс никогда не создавался, он не обслуживает предполагаемая цель Python class.

Если вы хотите создать пространство имен для группы связанных методов, создайте новый файл модуль, то есть еще один файл .py, и импортируйте его.

Пример

Здесь мы создаем модуль с именем helpers, который содержит несколько связанных методов. Затем этот модуль можно импортировать в наш файл main.

helpers.py

def method_1():
    ...

def method_2():
    ...

main.py

import helpers

helpers.method_1()
helpers.method_2()

Действительно ответил на мой вопрос. Спасибо

Sijeesh 13.02.2019 08:17

Как бы вы перевели подклассы и наследование в модульный подход?

Hyperplane 20.07.2021 15:30

@Hyperplane Если вам нужно больше методов, вы можете просто импортировать два модуля. В противном случае, если вы хотите изменить модуль с каким-либо методом, вы можете сделать from module import * во втором модуле и затенить некоторые методы своими собственными.

Olivier Melançon 20.07.2021 19:10

Я не совсем это понимаю. Методы класса могут использовать атрибуты класса и другие методы класса. Допустим, у меня есть класс: class A, у которого есть свойство класса: def data_dir(cls): return BASEPATH.joinpath(cls.__name__)) которое задает каталог, в котором класс может хранить некоторые данные, и некоторый метод класса def store_cls_data(cls), который сбрасывает данные, относящиеся к классу, в cls.data_dir. Тогда давайте создадим подкласс class B(A), который по наследству тоже может использовать эти методы. Если бы мне пришлось перевести это в модули, как бы вы справились с методами класса, получающими доступ к атрибутам класса?

Hyperplane 20.07.2021 19:58

@Hyperplane Я бы сказал, что если вам В самом деле нужно наследование, то используйте класс, потому что модули не предложат вам эту функцию.

Olivier Melançon 20.07.2021 22:26

Другие вопросы по теме