python声明类时继承不继承object类的区别
不加的叫做经典类或旧式类,但是现在python3的类都默认是继承了object的,所以可写可不写
下面举个例子说明:
首先说明下__class__功能与用法:
- __class__功能和type()函数一样,都是查看对象所在的类。
- __class__可以套用
在python3的环境下运行:
#coding:utf-8 #不继承 class Car(): pass #继承 class Bag(object): pass if __name__ == "__main__": car = Car() bag = Bag() print('实例所在类') print(type(car)) print(type(bag)) print('类所在类') print(type(Car)) print(type(Bag)) print('实例所在类') print(car.__class__) print(bag.__class__) print(bag.__class__.__class__)#实例所在类所在的类 print('类所在类') print(Bag.__class__) print(Car.__class__) # 类的类型都是type
返回:
/Users/user/PycharmProjects/python3/venv/bin/python /Users/user/PycharmProjects/python3/test.py 实例所在类 <class '__main__.Car'> <class '__main__.Bag'> 类所在类 <class 'type'> <class 'type'> 实例所在类 <class '__main__.Car'> <class '__main__.Bag'> <class 'type'> 类所在类 <class 'type'> <class 'type'> Process finished with exit code 0
可见结果是一样的,说明python3中有没有继承都一样,因为底层已经帮你继承了
如果我使用的是python2的环境来运行,返回内容为:
(deeplearning2) userdeMacBook-Pro:python3 user$ python test.py 实例所在类 <type 'instance'> <class '__main__.Bag'> 类所在类 <type 'classobj'> <type 'type'> 实例所在类 __main__.Car <class '__main__.Bag'> <type 'type'> 类所在类 <type 'type'> Traceback (most recent call last): File "test.py", line 28, in <module> print(Car.__class__) # 类的类型都是type AttributeError: class Car has no attribute '__class__'
⚠️python2不支持 类名.__class__
可见如果不继承object,实例的类型为instance类,类的类型为classobj类
而继承object的类,类的类型都是type类
除此之外还有一个区别就是内置函数的不同:
#coding:utf-8 #不继承 class Car(): pass #继承 class Bag(object): pass if __name__ == "__main__": car = Car() bag = Bag() print(dir(car)) print(dir(bag))
在python3中都是相同的,这里就不展示了。但是如果是在python2的环境下运行,返回:
(deeplearning2) userdeMacBook-Pro:python3 user$ python test.py ['__doc__', '__module__'] ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
可见继承了object类的类,有更多的内置函数可以使用,当你想要完成一些复杂操作的时候就很有用了