Python 为什么成员方法(递归地)调用自身不';你不会进入一个无休止的循环吗?

Python 为什么成员方法(递归地)调用自身不';你不会进入一个无休止的循环吗?,python,function,class,recursion,member,Python,Function,Class,Recursion,Member,我从一个博客上取了这个例子,但我不明白 >>> 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) >>&

我从一个博客上取了这个例子,但我不明白

>>> 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'}
>>> 
我希望递归调用obj.update()函数,直到“RuntimeError:超过最大递归深度”

但不是,update()函数将到达打印(self.data)

self.data.update(dict)
正在调用自己的方法update(),那么为什么它不能像我预期的那样工作呢


有人能解释一下为什么调用函数本身不会进入一个无休止的循环吗?带有示例的博客没有解释它。

它根本没有递归地调用自己


它不调用update中的self.update:它调用数据dict的update方法,这完全是另一回事。

它根本不是递归地调用自己


它不在update中调用self.update:它调用数据dict的update方法,这完全是另一回事。

这不调用Udict.update,但(不是递归的):

也许你误解了self.update(dict)


顺便说一句,不要用作变量名。它隐藏内置函数。

这不会调用
udit.update
,而是(非递归):

也许你误解了self.update(dict)


顺便说一句,不要用作变量名。它隐藏了内置函数。

当它调用
self.data.update
时,它不会进入相同的函数。它正在调用
self.data
update
函数,这只是一个dict。如果它调用类似于
self.update
的东西,那么递归正在发生,也许这就是你所想的。

当它调用
self.data.update
时,它不会进入相同的函数。它正在调用
self.data
update
函数,这只是一个dict。如果它调用类似于
self.update
的东西,那么递归正在发生,也许这就是您所想的。

self.data!=自我更新

这里的self.data是一个实例变量,它是一个字典对象。 Dictionary对象具有更新方法。因此,当您调用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)

如果有帮助,请告诉我。

self.data!=自我更新

这里的self.data是一个实例变量,它是一个字典对象。 Dictionary对象具有更新方法。因此,当您调用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)

如果有帮助,请告诉我。

谢谢@yopy,有你的例子我能理解。谢谢@yopy,有你的例子我能理解。谢谢@YS-L!真的,我对OOP很在行。我混淆了类方法和继承dict类型的对象方法。谢谢@YS-L!真的,我对OOP很在行。我混淆了类方法和继承dict类型的对象方法。