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类型的对象方法。