python中為什麼要繼承object類
這裡先列出一段簡短的程式碼。
-
# -.- coding:utf-8 -.-
-
# __author__ = 'zhengtong'
-
class Person(object):
-
name = "zhengtong"
-
if __name__ == "__main__":
-
x = Person()
通過這段程式碼,當我們例項化Person()這個類的時候,那x就是一個例項物件, 整個過程python除了建立Person這個類的名稱空間之外(把name=”zhengtong”加入到名稱空間中),還會去執行__builtin__.py中的object類,並將object類中的所有方法傳承給Person(也就是說Person繼承了object的所有方法).
回到主題上來,那寫object和不寫object有什麼區別?
好的,再用程式碼來理解它們的區別.
-
# -.- coding:utf-8 -.-
-
# __author__ = 'zhengtong'
-
class Person:
-
"""
-
不帶object
-
"""
-
name = "zhengtong"
-
class Animal(object):
-
"""
-
帶有object
-
"""
-
name = "chonghong"
-
if __name__ == "__main__":
-
x = Person()
-
print "Person", dir(x)
-
y = Animal()
-
print "Animal", dir(y)
執行結果
-
Person ['__doc__', '__module__', 'name']
-
Animal ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
-
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
-
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
Person類很明顯能夠看出區別,不繼承object物件,只擁有了__doc__ , __module__ 和 自己定義的name變數, 也就是說這個類的名稱空間只有三個物件可以操作.
Animal類繼承了object物件,擁有了好多可操作物件,這些都是類中的高階特性。
對於不太瞭解python類的同學來說,這些高階特性基本上沒用處,但是對於那些要著手寫框架或者寫大型專案的高手來說,這些特性就比較有用了,比如說tornado裡面的異常捕獲時就有用到__class__來定位類的名稱,還有高度靈活傳引數的時候用到__dict__來完成.
最後需要說清楚的一點, 本文是基於python 2.7.10版本,實際上在python 3 中已經預設就幫你載入了object了(即便你沒有寫上object)。
這裡附上一個表格用於區分python 2.x 和 python 3.x 中編寫一個class的時候帶上object和不帶上object的區別.
python 2.x | python 2.x | python 3.x | python 3.x |
不含object | 含object | 不含object | 含object |
__doc__ | __doc__ | __doc__ | __doc__ |
__module__ | __module__ | __module__ | __module__ |
say_hello | say_hello | say_hello | say_hello |
__class__ | __class__ | __class__ | |
__delattr__ | __delattr__ | __delattr__ | |
__dict__ | __dict__ | __dict__ | |
__format__ | __format__ | __format__ | |
__getattribute__ | __getattribute__ | __getattribute__ | |
__hash__ | __hash__ | __hash__ | |
__init__ | __init__ | __init__ | |
__new__ | __new__ | __new__ | |
__reduce__ | __reduce__ | __reduce__ | |
__reduce_ex__ | __reduce_ex__ | __reduce_ex__ | |
__repr__ | __repr__ | __repr__ | |
__setattr__ | __setattr__ | __setattr__ | |
__sizeof__ | __sizeof__ | __sizeof__ | |
__str__ | __str__ | __str__ | |
__subclasshook__ | __subclasshook__ | __subclasshook__ | |
__weakref__ | __weakref__ | __weakref__ | |
__dir__ | __dir__ | ||
__eq__ | __eq__ | ||
__ge__ | __ge__ | ||
__gt__ | __gt__ | ||
__le__ | __le__ | ||
__lt__ | __lt__ | ||
__ne__ | __ne__ |