Python 如何繼承str string?

2021-09-06 14:32:52 字數 1233 閱讀 6181

想搞乙個物件繼承自str,然後存一些額外資訊用來標識這個字串,然後理所當然地重寫了__init__發現跪了:

class newstring(str):

def __init__(self, value, othervalue):

str.__init__(self, value)

self.othervalue = othervalue

astring = newstring('hello', 'othervalue') # fail

後來發現str的__new__是在__init__前呼叫的,然後str在__new__的時候發現引數不對就拋了個異常。這麼詭異的行為主要是因為str的__new__就返回了個新的例項,而__init__沒毛用。python裡面的str大概是這個樣子:

class newstring(str):

def __new__(cls, value):

return str.__new__(cls, value)

def __init__(self, value):

pass

那麼想要繼承str並在構造時增加乙個引數咋整呢,可以重寫__new__:

class newstring(str):

def __new__(cls, value, othervalue):

return str.__new__(cls, value)

def __init__(self, value, othervalue):

self.othervalue = othervalue

或者更簡單粗暴的,用*args和**kwargs作為引數重寫__new__以繞過__new__的引數檢查,然後__init__就可以正常呼叫了:

class newstring(str):

def __new__(cls, value, *args, **keywargs):

return str.__new__(cls, value)

def __init__(self, value, othervalue):

self.othervalue = othervalue

然後這樣構造的newstring長的跟str乙個樣,並且可以攜帶額外資訊,有一點需要注意,就是str是個不可變物件,所以newstring構造出來後就別yy能修改它的值了…

python如何實現繼承 python如何實現繼承

物件導向程式設計的乙個主要優點是重用。繼承是實現同樣的機制之一。在繼承中,類 通常稱為超類 由另乙個類 通常稱為子類 繼承。子類為超類新增了一些屬性。下面是乙個示例python程式,用於說明如何在python中實現繼承。a python program to demonstrate inherita...

Python中如何單繼承?

繼承指的是類與類之間的關係,是一種什麼是什麼的關係,功能之一就是用來解決 重用問題。繼承是一種建立新類的方式,在python中,新建的類可以繼承乙個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類,繼承又分為單繼承和多繼承 繼承表示式 class 子類名 父類名 繼承可以讓子類從父類獲取...

Python如何繼承父類 init

如果在子類需要父類的構造方法就需要顯示地呼叫父類的構造方法,或者不重寫的構造方法。型別1 如果子類沒有重寫 init 子類會自動呼叫 init classf def init self,name self.name name print name self.name defgetname self ...