Python class inherits object
类声明从
我刚刚找到了一些代码,但我找不到原因。
1 2 | class MyClass(object): # class code follows... |
Python 3 .x:
Python 2 .x:
在python 3.x中定义基类时,可以从定义中删除对象。然而,这可以为一个严重的难以追踪的问题打开大门…
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开发人员的眼泪。
Is there any reason for a class declaration to inherit from
object ?
铊;博士:在Python 3分之间的相容性,从Python的2和3,没有原因的。在Python中,很多的原因。 </P > Python的2。x的故事:
在Python的2。x(从2.2起)有两页的风格研究班depending对在场的或缺乏
"经典"的新型模式:他们没有
1 2 3 4 | >>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ () |
"新"的教学风格:他们已经,或直接到indirectly(e.g inherit从一个嵌入式型),
1 2 3 4 5 6 7 8 9 10 | >>> 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'>,) |
没有一个怀疑,当写作(一级你会永远想去设计的新型模式。perks所做的即是numerous,一些他们的列表: </P >
-
支持descriptors。。。。。。。具体来说,下面的是建筑的机制可能与descriptors: </P >
-
classmethod :一种方法是receives之类的,作为一argument隐去的实例。 - 一种方法是:
staticmethod 并不减少的隐式argumentself 作为第一argument。。。。。。。 - 置业与
property :create函数的设计管理中去,和deleting设置一个属性。 -
__slots__ :saves存储器consumptions A类和属性的结果也在更快的接入方式。当然,它也不impose的局限性。 -
在
__new__ 静态法:参见自定义你的新类的instances是如何创造的。 </P > -
方法的分辨率(阶)(私营):在什么阶的基地班一级将是searched当试图做出的resolve这方法呼叫。 </P >
-
相关的)(私营,
super 电话。也看到,被视super() 超。 </P >
如果你不inherit从
一部downsides大学新型教学这是在类本身是demanding更多的存储器。除非你是创造了很多的类的对象,不过,我怀疑这将是我的问题和它的一个负sinking在海洋positives。。。。。。。 </P > Python 3.x的故事:
在Python 3,事情是简化。只读的新型类exist(提到的plainly AS类)所以,唯一的差分细胞增
1 2 | class ClassicSpam: pass |
是完全等效的(分离的从他们的名字:-)到这个: </P >
1 2 | class NewSpam(object): pass |
及到这个: </P >
1 2 | class Spam(): pass |
全有
1 2 | >>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}] [True, True, True] |
所以,如果你做的是什么?
在Python 2:总的inherit从
在Python中
是的,这是一个"新样式"对象。这是python2.2中介绍的一个特性。
新样式对象与经典对象具有不同的对象模型,有些对象无法与旧样式对象(例如,
那么链接来描述这些区别:在Python中,旧样式类和新样式类之间的区别是什么?
历史从学习Python的艰难之路:
Python's original rendition of a class was broken in many serious
ways. By the time this fault was recognized it was already too late,
and they had to support it. In order to fix the problem, they needed
some"new class" style so that the"old classes" would keep working
but you can use the new more correct version.They decided that they would use a word"object", lowercased, to be
the"class" that you inherit from to make a class. It is confusing,
but a class inherits from the class named"object" to make a class but
it's not an object really its a class, but don't forget to inherit
from object.
另外,为了让您了解新样式类和旧样式类的区别,新样式类总是继承自
1 2 | class NewStyle(object): pass |
另一个例子是:
1 2 | class AnotherExampleOfNewStyle(NewStyle): pass |
虽然旧样式的基类看起来像这样:
1 2 | class OldStyle(): pass |
一个老式的儿童班是这样的:
1 2 | class OldStyleSubclass(OldStyle): pass |
您可以看到,旧样式的基类不会从任何其他类继承,但是,旧样式类当然可以从其他类继承。从对象继承可以保证在每个Python类中都可以使用某些功能。在python 2.2中引入了新的样式类
是的,这是历史性的。如果没有它,它将创建一个旧的样式类。
如果在旧样式的对象上使用
类创建语句的语法:
1 2 | class <ClassName>(superclass): #code follows |
如果没有您特别想要继承的任何其他超类,那么
从技术上讲,
但是,如果在创建类时没有显式地使用单词
参考文献