【问题标题】:Base class class variable values in PythonPython中的基类类变量值
【发布时间】:2014-06-14 18:16:48
【问题描述】:

如果我想创建一个其他类将继承的基类,但从不使用类变量,我应该将类变量设置为什么?

例如:

class Spam:
    time_to_cook = None

    def eat(self):
        ...

class SpamWithEggs(Spam):
    time_to_cook = Minutes(5)

    def eat(self):
        ...

所有子类都有自己的time_to_cook,所以Spam中的值对程序的运行没有影响。

class Spam:
    time_to_cook = None

对我来说看起来不错,但它没有提供有关 time_to_cook 类型的任何信息。所以我倾向于

class Spam:
    time_to_cook = Minutes(0)

但这可能会给人一种误导的印象,即实际使用了 time_to_cook 的值。

我也在考虑完全忽略它,而是在文档字符串中提及它。

【问题讨论】:

  • 您也可以将其设置为 None 或零或您想要的任何占位符值,并且在文档字符串中提及它应该设置为什么样的值。
  • 请注意,SpamWithEggs不是Spam 的子类(因为后者未列为前者的基类)。
  • @martineau OOP,现已修复。
  • 能不能设置成Minute(0),然后放一个doc字符串说基类中没有用到?

标签: python oop coding-style class-attributes


【解决方案1】:

我喜欢 shavenwarthog 的回答,但是直接使用异常作为属性的值有点奇怪。所以,相反,无论你调用什么方法,你都可以传递一些会引发错误的东西:

class Complainer:
    def __getattr__(self, name):
        raise NotImplementedError 

并像这样使用它:

class Spam(object):
    time_to_cook = Complainer()

然后,每当您尝试调用Minute 的任何方法时,都会遇到异常。或者,如果您永远不会直接实例化 Spam,您可以只使用 make it entirely abstract 而不必担心。

【讨论】:

    【解决方案2】:

    我建议 NotImplementedError。它没有给出关于类型应该是什么的任何提示,但很明显不应该直接使用该值。

    class Spam(object):
        time_to_cook = NotImplementedError
    
        def eat(self):
            ...
    
    class SpamWithEggs(Spam):
        time_to_cook = Minutes(5)
    

    【讨论】:

    • 除了NotImplementedError 是一种类型,所以以这种方式使用它作为值有点奇怪恕我直言,即使(显然)合法。
    • @martineau:是的。 NotImplementedError() 更合适一点,因为它是实例与类型,但在这两种情况下都不表示变量的类型。这是一个黑客:)
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2016-02-12
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2014-01-30
    • 2016-01-24
    相关资源
    最近更新 更多