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類的類,有更多的內置函數可以使用,當你想要完成一些復雜操作的時候就很有用了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM