Лучшая практика, чтобы отключить создание классов - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу создать класс utils, который будет содержать только статические члены, например,

class A(object):
  X = 0
  @staticmethod
  def f():
    print X

Я также хочу, чтобы все его методы использовались без экземпляра, т.е. я хочу, чтобы пользователь вызывал A.f(), а не a = A(); a.f().

Один из способов - использовать @abc.abstractmethod, например,

class A(object):
  X = 0
  @abc.abstractmethod
  def __init__(self):
    raise Exception('Should not be created!')
  @staticmethod
  def f():
    print X

Второй вариант - не использовать абстрактный, поскольку он подразумевает наследование, а это не вещьЯ проектирую ель этого класса.В этом случае я бы просто поднял исключение как из __init__, так и __new__

Что было бы наилучшей практикой (третий вариант?)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Учитывая, что вы спрашиваете о том, что такое "лучшая практика", а не о том, как ее технически сделать, я могу вам ответить, что лучшая практика - не делать этого;) Я никогда раньше не видел такой конструкции, и я считаю, что она нарушает две«Принципы» Python:

  • Мы все здесь взрослые.
  • Принцип Наименьшего Удивления.

Мы все взрослые здесь

Это выражение также используется в литературе по объектно-ориентированному питону для объяснения отношения питона к членам частного класса, которого у Питона нет.

Когда вы создаете экземпляр некоторого класса, ничто не мешает вам осматриваться внутри и использовать различные внутренние, закрытые методы, которые (а) необходимы для функционирования класса, НО (б) не предназначены дляпрямое использование / доступ.

В конце концов, мы все согласные взрослые здесь.

от: https://mail.python.org/pipermail/tutor/2003-October/025932.html

Принцип наименьшего удивления.

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

В более общем смысле принцип означает, что компонентсистема должна вести себя так, как ожидает большинство пользователей;поведение не должно удивлять или удивлять пользователей.

от: https://en.wikipedia.org/wiki/Principle_of_least_astonishment

0 голосов
/ 05 февраля 2019

Питонический способ - поместить все эти статические функции в модуль.У вас нет общего состояния между этими функциями, почему вы должны использовать класс?

...