我想做一個自定義型別,它的行為就像內置型別一樣,但也會持有一些關于該值的額外資訊。 代碼是這樣的:
class Value。
def __init__(self, value)。
super().__init__()
這樣就可以了:
addi_into = {x:y, ...}
base = (Value, int)
attr = {**dict(Value.__dict__), **addi_info}。
_type = type('name'/span>, base, attr)
var = _type(1)
它的行為就像它的int一樣,除了我可以訪問Value中的額外資訊和方法。
唯一不起作用的是當我這樣做的時候:
addi_into = {x:y, ...}
base = (Value, list)
attr = {**dict(Value.__dict__), **addi_info}。
_type = type('name'/span>, base, attr)
var = _type(['some', 'list'] )
它打破了。 沒有錯誤,只是說串列是空的。
值方法和屬性如期到位。
因為 super().__init__(value) 對其他值來說,它被破壞了:
class Value。
def __init__(self, value)。
if type(value) == list: super().__init__(value)
else: super().__init__()
每個型別的建構式(int, str, list...)我都要求值是第一個引數,所以這讓我有點困惑。
你能建議一個更優雅的方法來實作這個問題嗎?
或者解釋一下為什么會這樣?
uj5u.com熱心網友回復:
Immutable型別(例如:str, int)沒有自己的__init__,而是從object繼承的。相反,它們在__new__中被完全初始化。對于這些型別,你可以完全省略對 super().__init__() 的呼叫,并且仍然得到正確的結果。
為了使其通用,你可能應該檢查基類的 __init__ 是否與 object.__init__ 不同,并且只在此時呼叫它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/320069.html
標籤:
上一篇:只有一個基礎虛擬的多路徑繼承
