Python 禁用类实例化的最佳实践

Python 禁用类实例化的最佳实践,python,python-2.7,abstract-class,static-methods,Python,Python 2.7,Abstract Class,Static Methods,我想创建一个只包含静态成员的utils类,例如 class A(object): X = 0 @staticmethod def f(): print X 我还希望所有it方法都在没有实例的情况下使用,也就是说,我希望用户调用A.f(),而不是A=A();a、 f() 一种方法是使用@abc.abstractmethod,例如 class A(object): X = 0 @abc.abstractmethod def __init__(self): r

我想创建一个只包含静态成员的utils类,例如

class A(object):
  X = 0
  @staticmethod
  def f():
    print X
我还希望所有it方法都在没有实例的情况下使用,也就是说,我希望用户调用
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
第二种选择是不使用抽象,因为它意味着继承,这不是我在这个类中设计的东西。在这种情况下,我只需要从
\uuuuu init\uuuu
\uuu new\uuuu
引发异常


最佳实践是什么(第三种选择?

python方法是将所有这些静态函数放在一个模块中。这些函数之间没有共享状态,为什么必须使用类?

鉴于您询问的是什么是“最佳实践”,而不是技术上如何做到这一点,我可以回答您,最佳实践是不这样做;)我以前从未见过这样的构造,我相信它违反了两条Python“原则”:

  • 我们在这里都是成年人
  • 最小惊奇原则
我们都是成年人 这个表达式也在面向对象的python文献中使用 解释python对私有类成员的态度 Python没有

当您创建某个类的实例时,没有什么可以阻止的 你可以避免在里面闲逛和使用各种内部的、私人的 方法是(a)类运行所必需的,但(b)不是 用于直接使用/访问

毕竟,我们都是成年人

发件人:

最小惊奇原则。 最小惊讶原则适用于用户界面和 软件设计。这是一个典型的原则表述,从1984年开始, is:“如果一个必要的特性具有很高的惊人因素,它可能是 需要重新设计该功能。”

更一般地说,原则意味着系统的一个组件 应该以大多数用户期望的方式行事;这个 行为不应让用户感到惊讶或惊讶


from:

如果您的类不需要实例化(或子类化),请不要使用类。你的课程应该只是一个模块,你为什么要这么做?答案取决于原因。为了安全:算了吧。但若这只是对程序员的一个提示,那个么事情可以做得更简单。请记住,人们仍然可以将您的类包含在一个新类中(因此组合),该类可以很容易地模拟继承,@aranfey我希望它具有私有方法和公共方法。我也应该在模块中这样做吗?@CIsForCookies是的。