我遇到了如何使 Python 類可序列化的想法。
class FileItem(dict):
def __init__(self, name):
dict.__init__(self, name=name)
x = FileItem("test")
print(x)
{'name': 'test'}
這作業正常,但我不明白如何。我認為從 dict 類dict.__init__呼叫該__init__方法來創建一個新實體,所以我希望它可以作業:
x = dict.__init__(name="test")
這會導致以下錯誤:
TypeError: descriptor '__init__' of 'dict' object needs an argument
為什么這與上面的示例不同?
uj5u.com熱心網友回復:
所以,請注意您沒有提供第二個引數__init__,
>>> x = dict.__init__(name="test")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor '__init__' of 'dict' object needs an argument
它需要實體,即self,作為第一個引數。當然,如果您創建一個適當的實體并傳遞它,則__init__回傳None:
>>> x = dict.__init__({}, name="test")
>>> print(x)
None
因為__init__不是建構式,所以是初始化器。在 Python 中,這是物件初始化程序中的兩個不同步驟。
“建構式”是__new__:
>>> dict.__new__(dict)
{}
在 Python 資料模型檔案中閱讀它。
此外,為了體面,您可能不應該灑水:
x = dict.__new__(dict)
在實際代碼中。但這就是它的作業原理。順便說一句,所有這些都發生在type.__call__。type是創建類的父類,一個元類。(它本身也是一種型別......type(type) is type就像type(dict) is type......)
>>> type.__call__(dict)
{}
uj5u.com熱心網友回復:
__new__創建新實體,但__init__用于初始化新創建的實體,因此__init__需要一個實體來使用。
當您這樣做時dict.__init__(name='test'),這不會在任何實體上運行,因此會出現錯誤。dict.__init__(self, name=name)另一方面,您確實將實體作為self引數傳遞,因此它可以作業。
通常,您會使用super().__init__(name=name)which 負責提供self作為引數,并且在您決定稍后更改基類時也可以使用。
uj5u.com熱心網友回復:
不同之處self在于未傳遞的屬性,該__init__屬性將其計算應用于self傳入的實體 (),如果該__init__函式沒有任何背景關系,它會拋出一個錯誤
,Lukas,祝你有美好的一天。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456029.html
上一篇:使用字典的Vlookup替代方案
