【问题标题】:best practice to disable a class instanciating禁用类实例化的最佳实践
【发布时间】:2019-02-05 08:46:10
【问题描述】:

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

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__ 提出异常

最佳做法是什么(第三种选择?)

【问题讨论】:

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

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    鉴于您问的是什么是“最佳实践”而不是如何在技术上做到这一点,我可以回答您,最佳实践是不要这样做;)我以前从未见过这样的结构,我认为它违反了两个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多