提问人:tjvr 提问时间:10/25/2010 最后编辑:Mateen Ulhaqtjvr 更新时间:4/9/2022 访问量:438171
为什么 Python 类会继承对象?
Why do Python classes inherit object?
答:
是的,这是历史性的。没有它,它会创建一个旧式的类。
如果你在一个旧式的对象上使用,你只会得到“instance”。在新样式对象上,您可以获取其类。type()
评论
type()
是的,这是一个“新样式”对象。这是 python2.2 中引入的一项功能。
新样式对象具有与经典对象不同的对象模型,并且某些功能无法正常用于旧样式对象,例如 和 描述符。请参阅本文,了解什么是新样式类。super()
@property
用于描述差异的 SO 链接:Python 中的旧样式和新样式类有什么区别?
评论
object
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 开发人员的眼泪。
评论
__metaclass__ = type
from __future__ import absolute_import, division, print_function
学习 Python 的艰难方式的历史:
Python 对类的原始演绎在许多严重的情况下被打破了 方式。当这个错误被识别出来时,已经太晚了, 他们必须支持它。为了解决这个问题,他们需要 一些“新类”风格,以便“旧类”继续工作 但你可以使用新的更正确的版本。
他们决定使用小写的“对象”一词来表示 从中继承以创建类的“类”。令人困惑的是, 但是一个类继承自名为“object”的类来创建一个类,但 它实际上不是一个对象,而是一个类,但不要忘记继承 从对象。
另外,只是为了让您知道新式类和旧式类之间的区别是什么,那就是新式类总是继承自 class 或从继承自 :object
object
class NewStyle(object):
pass
另一个例子是:
class AnotherExampleOfNewStyle(NewStyle):
pass
虽然旧式基类如下所示:
class OldStyle():
pass
一个老式的子类是这样的:
class OldStyleSubclass(OldStyle):
pass
您可以看到,旧式基类不会从任何其他类继承,但是,旧式类当然可以相互继承。从对象继承可保证某些功能在每个 Python 类中都可用。Python 2.2 中引入了新的样式类
评论
object
Object
Class
Dog
Object
Class
Object
class creation 语句的语法:
class <ClassName>(superclass):
#code follows
如果没有您特别想要继承的任何其他超类,则 应该始终是 object
,它是 Python 中所有类的根。superclass
从
技术上讲,object 是 Python 中“新式”类的根。但今天的新式班级与唯一的班级一样好。
但是,如果你在创建类时没有显式使用这个词,那么正如其他人提到的,Python 3.x 隐式继承自超类。但我想显性总是比隐性好(地狱)object
object
类声明有什么理由继承吗?
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'>,)
毫无疑问,在编写课程时,您总是希望选择新风格的课程。这样做的好处很多,列举其中的一些:
支持描述符。具体来说,以下构造可以通过描述符实现:
classmethod
:将类作为隐式参数而不是实例接收的方法。staticmethod
:不接收隐式参数作为第一个参数的方法。self
- 属性与属性:创建用于管理
属性
的获取、设置和删除的函数。 __slots__
:节省类的内存消耗,并加快属性访问速度。当然,它确实施加了限制。
__new__
静态方法:允许您自定义创建新类实例的方式。方法解析顺序 (MRO):在尝试解析要调用的方法时,将以什么顺序搜索类的基类。
与MRO有关,
超级
电话。另请参阅,super()
被认为是 super。
如果你不继承 ,忘记这些。可以在此处找到对前面要点的更详尽的描述以及“新”样式类的其他好处。object
新式类的缺点之一是类本身对内存的要求更高。但是,除非您正在创建许多类对象,否则我怀疑这会是一个问题,并且它是在积极因素的海洋中沉没的消极因素。
Python 3.x 故事:
在 Python 3 中,事情被简化了。只有新样式的类存在(简称为类),因此,添加的唯一区别是需要您再输入 8 个字符。这:object
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 中:始终显式继承对象
。获得福利。
在 Python 3 中:如果您正在编写与 Python 无关的代码,则继承自,也就是说,它需要在 Python 2 和 Python 3 中工作。否则不要,这真的没有区别,因为 Python 会在幕后为您插入它。object
评论
object
object
object
staticmethod
and work just fine even on old-style classes. sorta works for reading on old-style classes, it just fails to intercept writes (so if you assign to the name, the instance gains an attribute of the given name that shadows the property). Also note that 's improvement to attribute access speed is mostly about undoing the loss that new-style class attribute access incurs, so it's not really a selling point of new-style classes (the memory savings are a selling point though).classmethod
property
__slots__
str
int
tarfile
object
评论