Python在Python 2.2中引入了新式的类,到现在为止,旧式的类已经很老了 . 对旧式类的讨论是buried in the 2.x docs,并且在3.x文档中不存在 .
问题是, the syntax for old-style classes in Python 2.x is the same as the alternative syntax for new-style classes in Python 3.x . Python 2.x仍然被广泛使用(例如GAE,Web2Py),并且任何代码(或编码器)无意中将3.x样式的类定义带入2.x代码将最终导致一些严重过时的基础对象 . 而且由于旧式课程并不在人们的视线范围内,他们可能不知道是什么打击了他们 .
7 回答
是的,这是historical . 没有它,它会创建一个旧式的类 .
如果在旧式对象上使用
type()
,则只需"instance" . 在一个新式的对象上你得到它的类 .Python 3.x:
class MyClass(object):
=新式课程class MyClass:
=新式类(隐式继承自对象)Python 2.x:
class MyClass(object):
=新式课程class MyClass:
= OLD-STYLE CLASS说明:
在Python 3.x中定义基类时,允许从定义中删除对象 . 然而,这可以为严重难以追踪的问题打开大门......
Python在Python 2.2中引入了新式的类,到现在为止,旧式的类已经很老了 . 对旧式类的讨论是buried in the 2.x docs,并且在3.x文档中不存在 .
问题是, the syntax for old-style classes in Python 2.x is the same as the alternative syntax for new-style classes in Python 3.x . Python 2.x仍然被广泛使用(例如GAE,Web2Py),并且任何代码(或编码器)无意中将3.x样式的类定义带入2.x代码将最终导致一些严重过时的基础对象 . 而且由于旧式课程并不在人们的视线范围内,他们可能不知道是什么打击了他们 .
因此,只需拼出它就可以节省一些2.x开发人员的眼泪 .
这会创建一个new-style class .
来自Learn Python the Hard Way的历史:
也只是为了让你知道新式类和旧式类之间的区别是什么,新的类总是继承自
object
类或继承自object
的另一个类:另一个例子是:
旧式基类看起来像这样:
一个旧式的子类看起来像这样:
您可以看到Old Style基类不从任何其他类继承,但是,Old Style类当然可以相互继承 . 从对象继承可确保每个Python类都具有某些功能 . Python 2.2中引入了新的样式类
是的,这是一个“新风格”的对象 . 这是python2.2中引入的一个功能 .
新样式对象具有与经典对象不同的对象模型,并且某些内容将无法与旧样式对象一起正常工作,例如
super()
,@property
和descriptors . 有关新样式类的详细说明,请参阅this article .SO链接描述差异:What is the difference between old style and new style classes in Python?
类创建语句的语法:
在没有您特别想要继承的任何其他超类的情况下,
superclass
应始终为object
,这是Python中所有类的根 .object
在技术上是Python中"new-style"类的根 . 但今天的新式课程与唯一的课程风格一样好 .但是,如果在创建类时没有显式使用单词
object
,那么正如其他人所提到的,Python 3.x隐式继承自object
超类 . 但我猜显然总是好于隐含(地狱)Reference
tl; dr:在Python 3中,除了Python 2和3之间的兼容性之外,没有理由 . 在Python 2中,有很多原因 .
Python 2.x故事:
在Python 2.x(从2.2开始)中,根据
object
作为基类的存在与否,有两种类型的类:object
作为基类:object
作为基类:毫无疑问,在写一堂课时,你总是想要去上新课 . 这样做的好处很多,列出其中一些:
Support for descriptors . 具体来说,使用描述符可以实现以下结构:
classmethod:一种接收类作为隐式参数而不是实例的方法 .
staticmethod:不接收隐式参数
self
作为第一个参数的方法 .带有property的
属性:创建用于管理属性的获取,设置和删除的功能 .
slots:节省类的内存消耗,并且还可以加快属性访问速度 . 当然,它确实impose limitations .
new static method:允许您自定义新类实例的创建方式 .
Method resolution order (MRO):在尝试解析要调用的方法时,将以何种顺序搜索类的基类 .
与MRO相关,super calls . 另见,super() considered super.
如果你没有从
object
继承,请忘记这些 . 可以在here找到前面几个要点的详尽描述以及"new"样式类的其他特权 .新式类的缺点之一是类本身对内存要求更高 . 但是,除非你创造了许多阶级对象,否则我怀疑这将是一个问题,并且它在积极的海洋中是负面的沉没 .
Python 3.x故事:
在Python 3中,事情被简化了 . 只存在新式类(简称为类),因此,添加
object
的唯一区别是要求您输入8个以上的字符 . 这个:是完全相同的(除了他们的名字:-)到这个:
对此:
他们的
__bases__
都有object
.那么,你该怎么办?
In Python 2: 始终显式地从
object
继承 . 获得额外津贴 .In Python 3: 从
object
继承,如果你正在编写试图与Python无关的代码,也就是说,它需要在Python 2和Python 3中工作 . 否则,它实际上没有区别,因为Python在你后面插入它场景 .