问题:“class 类名(object)” 的写法为何存在?
简答:Python2与Python3的版本差别,python3中无需手动继承object。
一 详细说明
通俗来说,Python2中继承object的类称为新式类,不继承的为经典类,如class A(object)和class A ;严格来说在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性;反之,即不由任意内置类型派生出的类,则称之为“经典类”。
“新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”。 官网说明:https://www.python.org/doc/newstyle/
二 进一步讨论
下面对Python2中的object特性来简单说明,在Python2中,object的存在对类结构有两个影响,一是继承,二是类函数。
1.继承
如果一个类是object的子类,则他是新式类,否则为经典类,新式类在匹配方法时,使用广度优先原则(最接近当前类的父类方法),而经典类使用深度优先原则(离当前类最遥远的父类方法),比如
class A(object):
def f(self):
print 'A'
class B(A):
pass
class C(A):
def f(self):
print 'C'
class D(B,C):
pass
d = D()
d.f()
class A:
def f(self):
print 'A'
class B(A):
pass
class C(A):
def f(self):
print 'C'
class D(B,C):
pass
d = D()
d.f()
2. 类函数
Person类不继承object对象,只拥有了__doc__ , module 和 自己定义的name变量, 也就是说这个类的命名空间只有三个对象可以操作;Animal类继承了object对象,拥有了更多可操作对象,这些都是类中的高级特性。
class Person:
"""
不带object
"""
name = "person"
class Animal(object):
"""
带有object
"""
name = "animal"
if __name__ == "__main__":
x = Person()
print "Person", dir(x)
y = Animal()
print "Animal", dir(y)
Person ['__doc__', '__module__', 'name']
Animal ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
参考
|