我想创建一个仅包含静态成员的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__
最佳做法是什么(第三种选择?)
答案 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