# 方式1
class MyClass:
pass
# 方式2
class MyClass(object):
pass
有些好奇宝宝看到上述两种class的定义方式可能会问:方式1和方式2的区别在哪儿?加不加object有什么影响?
要回答这个问题便要扯到python的发展历史了。
python2.x
在python2(准确的说是从python2.2 开始)中存在两种风格的类,一个是经典类,另一个是新式类,他们的主要区别在于是否有把 object 作为基类。不懂object在python中作用的同学请先自行百度了解下,这里不再专门讲解了。
经典类
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()
新式类
>>> class NewSpam(object): # directly inherit from object
... pass
>>> NewSpam.__bases__
(,)
>>> class IntSpam(int): # indirectly inherit from object...
... pass
>>> IntSpam.__bases__
(,)
>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object
(,)
object存在的意义
我们再更进一步来看,加与不加object对你定义的类到底有什么影响,这是在python2.7下的测试结果:
>>> class A:
... pass
...
>>> dir(A)
['__doc__', '__module__']
>>> class B(object):
... pass
...
>>> dir(B)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
可以看到,如果我们继承了object,会获得非常多的魔术方法,这些方法包括诸如静态方法和类方法的构造,类属性的快速访问,定制类实例的实现方式等等
显然,大多数人会毫不犹豫的选择使用新式类,毕竟功能强大。
python3.x
在python3中,以下三种写法会获得同样的效果
class ClassicSpam:
pass
class NewSpam(object):
pass
class Spam():
pass
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
该如何做
python2.x:尽量继承object,这么好的东西不用白不用
python3.x:如果你的代码需要兼容python2,那么就在代码里显示的继承object,否则按照组内的编码规范或者个人习惯来就可以了
参考资料