2024-04-26 06:44:12 发布
网友
类声明是否有理由继承自object?
object
我只是找到了一些代码,我找不到一个很好的理由。
class MyClass(object): # class code follows...
Python 3
class MyClass(object):
class MyClass:
Python 2
在Python 3.x中定义基类时,允许从定义中删除object。然而,这可以为一个严重的难以追踪的问题打开大门
Python在Python 2.2中引入了新的样式类,到目前为止,旧的样式类已经相当老了。旧样式类的讨论是buried in the 2.x docs,在3.x文档中不存在。
问题是,Python2.x中旧样式类的语法与Python3.x中新样式类的替代语法相同。Python 2.x仍然被广泛使用(例如GAE、Web2Py),任何代码(或编码器)无意中将3.x风格的类定义引入到2.x代码中,最终都会得到一些严重过时的基本对象。而且因为老式的课程不受任何人的关注,他们可能不知道是什么打动了他们。
所以只要把它拼出来,省去一些2.x开发者的眼泪。
Is there any reason for a class declaration to inherit from object?
在Python3中,除了Python2和3之间的兼容性之外,没有理由。在Python 2中,有很多原因。
在Python 2.x(从2.2开始)中,根据基类object的存在与否,有两种类型的类:
“经典”样式的类:它们没有object作为基类:
>>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ ()
“new”样式的类:它们直接或间接地有一个基类:
>>> 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'>,)
毫无疑问,当你在写一个类的时候,你总是想去学习新的类。这样做的好处很多,列举其中一些:
Support for descriptors。具体地说,以下构造可以使用描述符:
self
^{}静态方法:允许您自定义如何创建新的类实例。
Method resolution order (MRO):当试图解析要调用的方法时,将按什么顺序搜索类的基类。
与MRO相关,^{} calls。另请参见,^{} considered super.
如果你不是从object继承的,就忘掉这些吧。关于前面的要点以及“新”样式类的其他优点的更详尽的描述可以在here中找到。
新型类的缺点之一是类本身对内存的要求更高。不过,除非你创建了许多类对象,否则我怀疑这是一个问题,它是一个消极的沉入积极的海洋。
在Python 3中,事情被简化了。只存在新样式的类(简单地称为类),因此,添加object的唯一区别是需要再键入8个字符。这:
class ClassicSpam: pass
完全等同于(除了他们的名字:-):
class NewSpam(object): pass
对此:
class Spam(): pass
所有人都有object在他们的__bases__中。
__bases__
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}] [True, True, True]
在Python 2中:总是从object显式地继承。得到额外津贴。
在Python 3中:继承自object如果您编写的代码试图与Python无关,也就是说,它需要在Python 2和python3中同时工作。否则就没什么区别了,因为Python会在幕后为您插入它。
是的,这是一个“新样式”对象。这是python2.2中引入的一个特性。
新样式对象与经典对象具有不同的对象模型,有些对象不能与旧样式对象一起正常工作,例如super()、@property和描述符。请参阅this article以获得有关新样式类的详细说明。
super()
@property
因此,链接以描述差异:What is the difference between old style and new style classes in Python?
Python 3
class MyClass(object):
=新样式类class MyClass:
=新样式类(隐式继承自object
)Python 2
class MyClass(object):
=新样式类class MyClass:
=旧式类说明:
在Python 3.x中定义基类时,允许从定义中删除
object
。然而,这可以为一个严重的难以追踪的问题打开大门Python在Python 2.2中引入了新的样式类,到目前为止,旧的样式类已经相当老了。旧样式类的讨论是buried in the 2.x docs,在3.x文档中不存在。
问题是,Python2.x中旧样式类的语法与Python3.x中新样式类的替代语法相同。Python 2.x仍然被广泛使用(例如GAE、Web2Py),任何代码(或编码器)无意中将3.x风格的类定义引入到2.x代码中,最终都会得到一些严重过时的基本对象。而且因为老式的课程不受任何人的关注,他们可能不知道是什么打动了他们。
所以只要把它拼出来,省去一些2.x开发者的眼泪。
在Python3中,除了Python2和3之间的兼容性之外,没有理由。在Python 2中,有很多原因。
Python 2.x的故事:
在Python 2.x(从2.2开始)中,根据基类
object
的存在与否,有两种类型的类:“经典”样式的类:它们没有
object
作为基类:“new”样式的类:它们直接或间接地有一个基类:
毫无疑问,当你在写一个类的时候,你总是想去学习新的类。这样做的好处很多,列举其中一些:
Support for descriptors。具体地说,以下构造可以使用描述符:
self
作为第一个参数接收的方法。^{} 静态方法:允许您自定义如何创建新的类实例。
Method resolution order (MRO):当试图解析要调用的方法时,将按什么顺序搜索类的基类。
与MRO相关,^{} calls 。另请参见,^{} considered super.
如果你不是从
object
继承的,就忘掉这些吧。关于前面的要点以及“新”样式类的其他优点的更详尽的描述可以在here中找到。新型类的缺点之一是类本身对内存的要求更高。不过,除非你创建了许多类对象,否则我怀疑这是一个问题,它是一个消极的沉入积极的海洋。
Python 3.x的故事:
在Python 3中,事情被简化了。只存在新样式的类(简单地称为类),因此,添加
object
的唯一区别是需要再键入8个字符。这:完全等同于(除了他们的名字:-):
对此:
所有人都有
object
在他们的__bases__
中。那么,你该怎么办?
在Python 2中:总是从
object
显式地继承。得到额外津贴。在Python 3中:继承自
object
如果您编写的代码试图与Python无关,也就是说,它需要在Python 2和python3中同时工作。否则就没什么区别了,因为Python会在幕后为您插入它。是的,这是一个“新样式”对象。这是python2.2中引入的一个特性。
新样式对象与经典对象具有不同的对象模型,有些对象不能与旧样式对象一起正常工作,例如
super()
、@property
和描述符。请参阅this article以获得有关新样式类的详细说明。因此,链接以描述差异:What is the difference between old style and new style classes in Python?
相关问题 更多 >
编程相关推荐