Python 2.7中的旧式和新式类

26

可能是重复问题:
Python中的旧式类和新式类

Python 2.7中新式类和旧式类的状况如何?

我不经常使用Python,但我对这个问题有点印象。文档似乎根本没有提到这个问题:Python教程:类。 我还需要担心这个问题吗?一般来说,我应该像以下这样声明我的类吗?

class MyClass:
    pass

或者呢?

class MyClass(object):
    pass

2
@LennartRegebro:那个问题是在2008年提出的,被接受的答案也是在2008年。我想知道2012年Python 2.7的情况如何。从那个问题的阅读中,答案对我来说并不明显。 - User
你有什么理由认为从Python 2.6到Python 2.7的答案会发生变化吗?虽然这并不重要。无论你发布这个问题的原因是什么,它都是一个完全重复的问题。 - Lennart Regebro
@LennartRegebro:是的,四年的时间很长,很多事情都可能发生变化。没想到Python 2.6已经四年了。 - User
在这种情况下,对原始问题的评论可能是一个选项,询问是否仍然有效。但在我看来,除非你有理由怀疑它已经改变,否则甚至不需要这样做。答案非常清楚:不要使用旧式类,它们只是为了向后兼容而存在。为什么这个答案会在Python 2.7中改变呢?他们会突然决定旧式类实际上更好吗?当然不会。 - Lennart Regebro
1
@LennartRegebro:作为一个经常关注Python社区的人,这可能很明显,但对于不了解的人来说并不是。事实上,我在那个问题上发表了评论,然而16个小时后仍然没有答案。这个问题被回答只用了几秒钟。当我搜索“python classes”时,我被带到了http://docs.python.org/2/tutorial/classes.html,其中没有一个“new-style”类从“object”派生的例子,这让我想知道我应该像`class MyClass还是class MyClass(object)`这样声明我的类,因此提出了我的问题。 - User
2
这不是一个重复问题: 首先,它具有两种样式的语法,而链接的问题在问题或答案中都没有提到。对于新手或仅使用3.x后新接触2.x的人来说,这个问题/答案更好。 - Zero
2个回答

26

始终继承"object"。这些是新的样式类。

  • 这样,您就可以准备好使用Python 3了。

  • 如果需要,这样做可以正常使用类似于 ".super()" 的功能。


6
更不用说方法装饰器(@property@classmethod@staticmethod)只能与新式类一起使用。 - Martijn Pieters
3
你能否在Python 3中使用class MyClass:来定义新式类? - GP89
@GP89:是的,在Python 3中。 - Lennart Regebro
@MartijnPieters,你能详细说明一下吗?我注意到这个答案很旧了。最近我尝试在Python 2.7.14中对旧式类使用这些装饰器,它们似乎工作得很好。 - Bogdan Prădatu
1
@BogdanPrădatu它们不会正常工作。例如,旧式类中的属性不能有setter。文档明确指出这些只适用于新样式的类;请参阅property description 以获取示例。 - Martijn Pieters

11

您应该始终使用新型类。新型类是Python编程语言中将内置类型和用户定义的类统一的努力的一部分。

新型类有很多优点,例如:

  • 属性:由get/set方法定义的属性
  • 静态方法和类方法
  • 新的getattribute钩子,与getattr不同,它在每次访问属性时都会被调用,而不仅仅是在实例中找不到属性时才会被调用
  • 描述符:通过对象定义属性访问行为的协议
  • 重写构造函数new
  • 元类

来源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接