Python 类为什么继承对象?
- 2024-11-27 10:43:00
- admin 原创
- 12
问题描述:
为什么下面的类声明继承自object
?
class MyClass(object):
...
解决方案 1:
类声明继承自有什么理由吗
object
?
在 Python 3 中,除了兼容 Python 2 和 3 之外,没有其他原因。在 Python 2 中,原因有很多。
Python 2.x 的故事:
在 Python 2.x(从 2.2 开始)中,根据是否存在object
基类,有两种类型的类:
“经典”风格的类:它们没有
object
基类:
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()
“新”样式类:它们直接或间接地(例如从内置类型继承)具有
object
以下基类:
>>> class NewSpam(object): # directly inherit from object
... pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int): # indirectly inherit from object...
... pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object
(<type 'object'>,)
毫无疑问,在编写类时,您总是希望使用新式类。这样做的好处很多,下面列出其中一些:
支持描述符。具体来说,使用描述符可以实现以下构造:
1. `classmethod`:以类而不是实例作为隐式参数接收的方法。
2. `staticmethod``self`:不接收隐式参数作为第一个参数的方法。
3. 属性`property`:创建用于管理属性的获取、设置和删除的函数。
4. `__slots__`:节省类的内存消耗,同时加快属性访问速度。当然,它也有一定的局限性。
静态方法
__new__
:允许您自定义如何创建新的类实例。方法解析顺序(MRO):当尝试解析调用哪个方法时,将按照什么顺序搜索类的基类。
与 MRO 相关,
super
调用。另请参阅,super()
视为超级。
如果你不继承object
,就忘掉这些吧。关于前面的要点以及“新”样式类的其他优点的更详尽描述可以在这里找到。
新式类的一个缺点是类本身占用的内存更多。除非你创建了很多类对象,否则我怀疑这不会是个问题,而且这是一个优点中的缺点。
Python 3.x 的故事:
在 Python 3 中,事情变得简单了。只有新式类存在(简称为类),因此,添加的唯一区别object
是需要您输入 8 个字符。这:
class ClassicSpam:
pass
与以下完全等同(除了名称 :-):
class NewSpam(object):
pass
以及这个:
class Spam():
pass
每个人都有object
自己的__bases__
。
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
那么,你应该怎么做呢?
在 Python 2 中:始终 显式地从 继承object
。获取特权。
在 Python 3 中:如果您编写的代码试图与 Python 无关,则从中继承object
,也就是说,它需要在 Python 2 和 Python 3 中都能工作。否则不要这样做,这真的没有什么区别,因为 Python 会在后台为您插入它。
解决方案 2:
Python 3
class MyClass(object):
= 新式类class MyClass:
= 新式类(隐式继承自object
)
Python 2
class MyClass(object):
= 新式类class MyClass:
=老式阶级
解释:
在 Python 3.x 中定义基类时,可以object
从定义中删除。然而,这可能会带来一个非常难以追踪的问题……
Python 在 Python 2.2 中引入了新式类,而现在旧式类已经相当老旧了。旧式类的讨论隐藏在 2.x 文档中,而在 3.x 文档中则不存在。
问题是,Python 2.x 中旧式类的语法与 Python 3.x 中新式类的替代语法相同。Python 2.x 仍然被广泛使用(例如 GAE、Web2Py),任何代码(或程序员)在不知情的情况下将 3.x 样式的类定义带入 2.x 代码中,最终都会产生一些严重过时的基础对象。而且由于旧式类不在任何人的关注范围内,他们可能不知道是什么影响了他们。
因此,只需用很长的方式将其说清楚,就可以让 2.x 开发人员少受些苦。
解决方案 3:
是的,这是一个“新样式”对象。这是 python2.2 中引入的一个功能。
新式对象与传统对象具有不同的对象模型,有些东西无法与旧式对象正常工作,例如,super()
和@property
描述符。请参阅本文以详细了解什么是新式类。
SO 链接描述了差异:Python 中旧式类和新式类有什么区别?
解决方案 4:
《Learn Python the Hard Way》中的历史:
Python 最初对类的解释在许多方面都存在严重缺陷。当这个错误被发现时已经太晚了,他们不得不支持它。为了解决这个问题,他们需要某种“新类”风格,这样“旧类”就可以继续工作,但你可以使用新的更正确的版本。
他们决定使用小写的单词“object”作为“类”,从中继承而来,从而形成一个类。这很令人困惑,但类从名为“object”的类继承而来,从而形成一个类,但它实际上不是一个对象,而是一个类,但不要忘记从对象继承。
另外,只是为了让您了解新式类和旧式类之间的区别,新式类总是从 object
类继承或从继承自的另一个类继承object
:
class NewStyle(object):
pass
另一个例子是:
class AnotherExampleOfNewStyle(NewStyle):
pass
旧式基类如下所示:
class OldStyle():
pass
旧式的子类如下所示:
class OldStyleSubclass(OldStyle):
pass
您可以看到,旧式基类不会从任何其他类继承,但是,旧式类当然可以相互继承。从对象继承可确保每个 Python 类中都有某些功能。新式类是在 Python 2.2 中引入的
解决方案 5:
是的,这是历史性的。没有它,就会创建一个旧式类。
如果在旧式对象上使用type()
,则只会获得“实例”。在新式对象上,您将获得其类。
解决方案 6:
类创建语句的语法:
class <ClassName>(superclass):
#code follows
在没有任何其他您特别想要继承的超类的情况下,superclass
应该始终是object
,它是 Python 中所有类的根。
object
从技术上讲,它是 Python 中“新式”类的根源。但如今,新式类几乎是唯一的类样式。
但是,如果你在创建类时没有明确使用该词object
,那么正如其他人提到的那样,Python 3.x 会隐式地从超类继承object
。但我想显式总是比隐式更好(见鬼)
参考
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件