【问题标题】:Best practice for Python 3 class creationPython 3 类创建的最佳实践
【发布时间】:2018-01-31 16:22:22
【问题描述】:

在我的研究中,我发现在 Python 3 中,这三种类型的类定义是同义词:

class MyClass:
    pass

class MyClass():
    pass

class MyClass(object):
    pass

但是,我无法找到推荐的方式。我应该使用哪一个作为最佳做法?

【问题讨论】:

  • 请注意:在我的情况下,代码只会在考虑 python3 的情况下运行,因此明确不希望向后兼容。

标签: python python-3.x class


【解决方案1】:

我会说:使用第三个选项:

class MyClass(object):
    pass

显式地提到你想继承objectZen of Python 没有提到:“显式优于隐式。”)并且你不会遇到讨厌的错误以防您(或其他人)曾经在 Python 2 中运行代码 where these statements are different

【讨论】:

    【解决方案2】:

    在 Python 2 中,有 2 个types of classes。要使用新样式,您必须从object 显式继承。如果不是,则使用旧式实现。

    在 Python 3 中,所有类都隐式扩展 object,无论你自己是否这么说。

    你可能还是想使用新风格的类,但如果你的代码应该同时使用 python 2 和 3,你必须显式地从对象继承:

    class Foo(object):
        pass 
    

    要跳到另一个答案,是的 Zen of Python 状态

    显式优于隐式。

    我认为这意味着我们应该避免代码中可能出现的混淆,就像我们应该在一般语言中一样,记住代码就是交流。

    如果您只使用 python 3,并且您的代码/项目明确声明,没有可能的混淆,所有没有明确继承的类都会自动从对象继承。如果由于某种模糊的原因,基类在未来发生了变化(让我们想象从 objectObject),相同的代码将起作用。 Zen of Python 也这么说

    简单胜于复杂。

    (当然在这个例子中复杂是夸大其词但仍然......)

    同样,如果你的代码只支持python3,你应该使用最简单的形式:

    class Foo:
        pass
    

    只有() 的表格毫无用处,因为它没有提供任何有价值的信息。

    【讨论】:

    • 使用最简单形式的另一个论据可能是,从默认对象显式继承是 Python 特有的。据我所知,这并不常见,例如在 C++ 或 Java 中。
    • @TimKeller 确实如此,归根结底,从对象继承是一个实现细节,并且类隐式继承的约定对于每个人来说都很清楚。
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2020-07-12
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多