python定义类时必须指定基类吗_定义class时是否需要继承object?

# 方式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,否则按照组内的编码规范或者个人习惯来就可以了

参考资料

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值