Как отключить создание экземпляров класса в Python?

Иногда я создаю класс, и он используется только для хранения некоторых значений или статических методов, и я никогда не хочу создавать экземпляр.

Есть ли способ выразить это в Python3?

Eg:

class MyClass:
    @staticmethod
    def hello():
        print("world")

    # is there a better way to do this?
    def __init__(self):
        raise Exception("instantiation isnt supported for this class!")

# OK
MyClass.hello()

# NOT OK
c = MyClass()

person ideasman42    schedule 16.10.2014    source источник
comment
Зачем помещать их в класс, а не помещать значения и функции в отдельный скрипт и import его?   -  person jonrsharpe    schedule 16.10.2014
comment
Конечно, в основном это лучше, иногда я делаю автономные скрипты, и удобно группировать такие функции (также можно использовать методы подкласса и класса, в этом случае вы все равно захотите использовать класс вместо модуля).   -  person ideasman42    schedule 16.10.2014


Ответы (1)


Вы можете использовать базовый класс objectless, найденный в этом ответе (который на самом деле является ответом на другой вопрос).

class objectless:
    def __new__(cls, *args, **kwargs):
        raise RuntimeError('%s should not be instantiated' % cls)

class UninstantiateableClass(objectless):
    @classmethod
    def foo(cls):
        return 'bar'
    ...

Обратите внимание, что в python2 objectless должен явным образом подклассировать object, чтобы быть классом нового стиля.

person shx2    schedule 16.10.2014
comment
хорошо, обратите внимание на правописание должно быть instanciated - person ideasman42; 16.10.2014
comment
Почему objectclass должен быть подклассом object? (в Python3) - person ideasman42; 16.10.2014
comment
Это не обязательно, это просто привычка python2. - person shx2; 16.10.2014
comment
@ideasman42 Instantiated верен согласно моему словарю. - person wizzwizz4; 16.07.2018
comment
@ideasman42 instanciated -> Ошибочное написание экземпляра. en.wiktionary.org/wiki/instanciated - person Bronumski; 07.12.2019