對於無關的類,很少有很好的理由對此進行此操作,例如Robe
和Dress
。沒有一點工作,很難確保你最終得到的對象處於健全的狀態。
但是,從基類繼承時,如果要使用非標準的工廠函數或構造函數來構建基礎對象,它可能很有用。下面是一個例子:
class Base(object):
pass
def base_factory():
return Base() # in real code, this would probably be something opaque
def Derived(Base):
def __new__(cls):
self = base_factory() # get an instance of Base
self.__class__ = Derived # and turn it into an instance of Derived
return self
在這個例子中,派生類的__new__
方法要使用base_factory
方法,該方法返回Base
類的實例來構造它的對象。通常這種工廠在圖書館的某個地方,並且你無法確定它是如何製作這個物品的(你不能只是自己撥打Base()
或以得到相同的結果)。
的實例的屬性__class__
被重寫,使得主叫Derived.__new__
的結果將是Derived
類,這保證了它會有Derived.__init__
方法調用它(如果這樣的方法存在的話)的一個實例。
這個答案看起來很徹底,但我是編程新手,因此很難理解它。忽略'__new__' /構造函數方面,我可以看到,如果某個庫中某個類定義了一個類,並且已經創建了自己的繼承它的類,那麼可以通過創建一個實例來創建後者的一個實例前者然後「轉化」。但是,爲什麼不簡單地實例化繼承類呢?我承認我不理解構造函數的概念或'__new__'方法的功能。 – henrebotha 2013-04-07 18:48:10
@henrebotha:我建議閱讀關於[Python數據模型](http://docs.python.org/3/reference/datamodel.html#basic-customization)。調用類的'__new__'方法來構造它的實例。調用Derived()會觸發對Derived .__ new__的調用(如果存在)。通常'__new__'返回由'object .__ new__'創建的一個新對象(通過'super'調用),但它不必這樣做。在上面的例子中,我們從工廠函數中獲取了實例,然後對其進行了自定義。另見[這個前面的問題](http://stackoverflow.com/questions/15330755/construct-class-from-superclass-instance)。 – Blckknght 2013-04-07 19:42:51