Python 2.7中的旧式和新式类[重复]

Posted

技术标签:

【中文标题】Python 2.7中的旧式和新式类[重复]【英文标题】:Old-style and new-style classes in Python 2.7 [duplicate] 【发布时间】:2012-11-28 19:18:58 【问题描述】:

可能重复: Old style and new style classes in Python

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

我不经常使用 Python,但我隐约记得这个问题。文档似乎根本没有提到这个问题:The Python Tutorial: Classes。我还需要担心这个吗?一般来说,我应该像下面这样声明我的类吗?

class MyClass:
    pass

还是?

class MyClass(object):
    pass

【问题讨论】:

@LennartRegebro:这个问题是在 2008 年提出的,在 2008 年也得到了接受的答案。我问的是 2012 年 Python 2.7 的情况如何。阅读该问题后,我的答案并不明显。 您是否有任何理由认为答案会从 Python 2.6 更改为 Python 2.7?虽然那没关系。无论您发布此问题的原因是什么,它都是完全重复的。 @LennartRegebro:是的,4 年时间很长,很多东西都可以改变。没想到 Python 2.6 已经是 4 年前了。 @LennartRegebro:也许作为一个经常关注 Python 社区的人,这是显而易见的,但作为一个不关注 Python 社区的人,情况并非如此。事实上,我确实对这个问题发表了评论,但 16 小时后仍未得到答复。回答这个问题需要几秒钟。当我用谷歌搜索“python 类”时,我被带到了docs.python.org/2/tutorial/classes.html,那里没有一个派生自“object”的“新式”类的例子,这让我想知道我是否应该像 class MyClass 或 @ 这样声明我的类987654327@ 因此我的问题。 这不是重复的:对于初学者来说,它具有 front 和 center 两种样式的语法,链接的问题在问题或答案中都没有提及。这个问题/答案对于 python 新手或仅使用 3.x 后的 2.x 新手来说要好得多 【参考方案1】:

总是子类化“对象”。这些是新的样式类。

这样你就可以使用 Python 3了。

.super() 这样的东西可以正常工作,如果你需要的话。

【讨论】:

更不用说方法装饰器(@property@classmethod@staticmethod)只适用于新式类。 你不能在 py3 中做class MyClass:,但它仍然是一个新的样式类吗?? @GP89:是的,在 Python 3 中。【参考方案2】:

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

新的样式类有几样东西可以提供,例如:

属性:由 get/set 方法定义的属性 静态方法和类方法 新的 getattribute 挂钩,与 getattr 不同,称为 对于每个属性访问,不仅仅是当属性不能被访问时 在实例中找到 描述符:定义属性访问行为的协议 通过对象 重写构造函数new 元类

Source.

【讨论】:

以上是关于Python 2.7中的旧式和新式类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python 之简单浅谈新式类和旧式类(或称经典类)

python新式类与旧式类

python新式类中的__new__方法与__init__方法

旧式类、新式类和元类

Python新式类

python开发学习-day07(面向对象之多态类的方法反射新式类and旧式类socket编程)