この例はブログから取ったものですが、わかりません。
>>> class Udict:
def __init__(self, dict=None):
self.data = {}
if dict is not None: self.update(dict)
def update(self, dict=None):
self.data.update(dict)
print(self.data)
>>> d = {1:'one', 2:'two'}
>>> g = Udict(d)
{1: 'two', 2: 'two'}
>>> g.data
{1: 'two', 2: 'two'}
>>> c.Udict()
{}
>>> c.update({3: 'three'})
{3: 'three'}
>>>
'RuntimeError:最大再帰深度を超える'までobj.update()関数が再帰的に呼び出されることを期待しています
しかし、いいえ、update()関数はに到達します print(self.data)
self.data.update(dict)
それ自体にメソッドupdate()を呼び出しているのに、なぜそれが期待どおりに機能しないのですか?
関数の呼び出し自体が無限ループに入らない理由を誰かが私に説明できますか?例のあるブログはそれを説明していません。
self.data!= self.update
ここで、self.dataは、ディクショナリオブジェクトであるインスタンス変数です。ディクショナリオブジェクトにはupdateメソッドがあります。したがって、self.data.update()を呼び出すと、ディクショナリ内のメソッドが呼び出されます。
>>> help(dict.update)
Help on method_descriptor:
update(...)
D.update(E, **F) -> None. Update D from dict/iterable E and F.
If E has a .keys() method, does: for k in E: D[k] = E[k]
If E lacks .keys() method, does: for (k, v) in E: D[k] = v
In either case, this is followed by: for k in F: D[k] = F[k]
>>>
そして、self.updateはクラスUdictのインスタンスメソッドです。
それでは、コードを少し書き直してみましょう。
>>> class Udict:
... def __init__(self):
... self.data = dict()
... def update(self, dic=None):
... if dic:
... self.data.update(dic)
... return self.data
...
>>> d = {1:'one', 2:'two'}
>>> g = Udict()
>>> g.update(d)
{1: 'one', 2: 'two'}
より良い方法として、init()からメソッドを呼び出さないでください。属性の初期化にのみinit()を使用してください。そのため、次のような引数からdicを初期化することもできます。
>>> class Udict:
... def __init__(self, dic=None):
... self.data = dict()
... if dic:
self.data.update(dic)
それが役に立ったら教えてください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加