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类的类,有更多的内置函数可以使用,当你想要完成一些复杂操作的时候就很有用了

 

posted @ 2019-07-16 15:19  慢行厚积  阅读(3728)  评论(0编辑  收藏  举报