python用法 - python plot教學




Python類繼承對象 (5)

是否有任何理由讓類聲明繼承object

tl; dr:在Python 3中,除了Python 2和3之間的兼容性外, 沒有理由 。 在Python 2中,有很多原因

Python 2.x故事:

在Python 2.x中(從2.2開始),有兩種類型的類,這取決於對像是否存在作為基類:

  1. “經典”風格類:它們沒有對object作為基類:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. “新”風格的類:它們直接或間接地 (例如從內建類型繼承),作為基類的object

    >>> class NewSpam(object):           # directly inherit from object
    ...    pass
    >>> NewSpam.__bases__
    (<type 'object'>,)
    >>> class IntSpam(int):              # indirectly inherit from object...
    ...    pass
    >>> IntSpam.__bases__
    (<type 'int'>,) 
    >>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
    (<type 'object'>,)
    

毫無疑問,在寫作課程時,你總是會想要參加新式課程。 這樣做的好處很多,列出其中的一些:

如果你不從object繼承,忘記這些。 可以在here找到對前面的要點以及其他“新”風格類的更詳盡的描述。

新式課程的一個缺點是課程本身對內存要求更高。 但是,除非你創造了許多類別對象,否則我懷疑這會成為一個問題,而且這是積極的一面。

Python 3.x故事:

在Python 3中,事物被簡化了。 只有新式類存在(簡稱為類),因此添加object的唯一區別是需要輸入8個以上的字符。 這個:

class ClassicSpam:
    pass

是完全相同的(除了他們的名字:-):

class NewSpam(object):
     pass

並為此:

class Spam():
    pass

在他們的__bases__都有object

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]

那你該怎麼辦?

在Python 2中: 始終明確地繼承object 。 獲得福利。

在Python 3中:如果您正在編寫試圖成為Python不可知論的代碼,那麼它就需要繼承object ,即它需要在Python 2和Python 3中都可以工作。否則,不要這樣做,它實際上沒有區別,因為Python會將它插入你在幕後。

是否有任何理由讓類聲明繼承object

我剛剛發現了一些代碼,我找不到一個很好的理由。

class MyClass(object):
    # class code follows...

學習Python的歷史: 艱辛的道路

很多嚴肅的方式都破壞了Python對一個類的原始翻版。 在認識到這個錯誤時,已經太晚了,他們不得不支持它。 為了解決這個問題,他們需要一些“新班級”的風格,以便“舊班級”可以繼續工作,但是你可以使用新的更正確的版本。

他們決定,他們會用一個“小對象”這個詞來形容你是繼承而成為一個班級的“階級”。 這是令人困惑的,但是一個類繼承自名為“object”的類來創建一個類,但它不是一個真正的類對象,但是不要忘記從對象繼承。

也只是為了讓你知道新風格類和舊風格類之間的區別是什麼,它是新風格的類總是從對object類或從另一個繼承自object類繼承的:

class NewStyle(object):
    pass

另一個例子是:

class AnotherExampleOfNewStyle(NewStyle):
    pass

雖然舊式的基類看起來像這樣:

class OldStyle():
    pass

而一個老式的孩子班級看起來像這樣:

class OldStyleSubclass(OldStyle):
    pass

您可以看到舊式基類不會從任何其他類繼承,但是,舊式類當然可以相互繼承。 繼承對象保證每個Python類都有某些功能可用。 Python 2.2引入了新的風格類


是的,這是historical 。 沒有它,它會創建一個舊式的課程。

如果對舊式對象使用type() ,則只需獲取“instance”。 在新風格的對像上,你可以獲得它的類。


是的,這是一個'新風格'的對象。 這是python2.2中引入的一個功能。

新樣式對象與傳統對像有不同的對像模型,有些東西不適用於舊樣式對象,例如super()@property和描述符。 請參閱本文以獲取有關新樣式類的詳細說明。

SO鏈接的差異描述: Python中舊風格和新風格類的區別是什麼?


類創建語句的語法:

class <ClassName>(superclass):
    #code follows

在沒有任何其他超類特別想要繼承的情況下, superclass應該始終是object ,它是Python中所有類的根。

object在技​​術上是Python中“新風格”類的根源。 但今天的新式課程和課程的唯一風格一樣好。

但是,如果您在創建類時沒有明確使用單詞object ,那麼正如其他人所提到的那樣,Python 3.x隱式地繼承了object超類。 但我猜顯然總是比隱式(地獄)更好,

Reference







inheritance