禁用类实例化的最佳实践

时间:2019-02-05 08:46:10

标签: python python-2.7 abstract-class static-methods

我想创建一个仅包含静态成员的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 :(得分:2)

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

答案 1 :(得分:1)

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

  • 我们都是成年人。
  • 最少惊讶的原则。

我们这里都是大人

  

此表达式也用于面向对象的python文献中   解释python对私有类成员的态度,   Python没有。

     

创建某个类的实例时,没有什么可以防止的   您无需在内部闲逛并使用各种内部的,私人的   (a)类起作用所必需的方法,但(b)不是   供直接使用/访问。

     

毕竟,我们都是成年人。

来自:https://mail.python.org/pipermail/tutor/2003-October/025932.html

最少惊讶的原则。

  

最小惊讶度原则适用于用户界面和   软件设计。该原则的典型提法,始于1984年,   是:“如果必要功能具有很高的惊讶系数,则可能是   重新设计功能所必需的。”

     

更一般而言,该原理意味着系统的组成部分   应该以大多数用户期望的方式运行;的   行为不应使用户惊讶或惊讶。

来自:https://en.wikipedia.org/wiki/Principle_of_least_astonishment