Python类中check_balance方法调用报NameError错误求助
问题排查与修复
你的代码里有两个关键问题导致了NameError:
1. 类方法定义与递归调用路径错误
类的实例方法必须以self作为第一个参数(你用t也可,但惯例是self),且内部递归调用时,必须通过类或实例引用该方法,不能直接写函数名——直接写会被解释器当成全局函数查找,自然找不到。
原方法定义:
def check_balance(t): if t.isLeaf() or t.isEmpty(): return True if t.getLc().isEmpty() or t.getRc().isEmpty(): return False return check_balance(t.getLc()) and check_balance(t.getRc())
修复后(统一用self作为实例参数,递归时通过self调用方法):
def check_balance(self): if self.isLeaf() or self.isEmpty(): return True if self.getLc().isEmpty() or self.getRc().isEmpty(): return False return self.check_balance(self.getLc()) and self.check_balance(self.getRc())
2. 方法调用方式错误
你直接写check_balance(a),这是在全局作用域找函数,但check_balance是tree类的成员方法,必须通过实例调用:
print(a.check_balance())
完整修复后的代码
class tree(): def __init__(self,a=None,lc=None,rc=None): self.label=a self.lt=lc self.rt=rc if a is not None: if lc is None: self.lt=tree() if rc is None: self.rt=tree() def getLabel(self): return self.label def isEmpty(self): return self.label is None def isLeaf(self): return (self.lt.isEmpty() and self.rt.isEmpty()) def getLc(self): return self.lt def getRc(self): return self.rt def check_balance(self): if self.isLeaf() or self.isEmpty(): return True if self.getLc().isEmpty() or self.getRc().isEmpty(): return False return self.check_balance(self.getLc()) and self.check_balance(self.getRc()) a = tree(1, tree(2, tree(7), tree(8)), tree(3, tree(7), tree())) print(a.check_balance())
可选:用类方法实现
如果想保留“传实例调用”的方式,可给方法加@classmethod装饰器,定义如下:
@classmethod def check_balance(cls, t): if t.isLeaf() or t.isEmpty(): return True if t.getLc().isEmpty() or t.getRc().isEmpty(): return False return cls.check_balance(t.getLc()) and cls.check_balance(t.getRc())
此时调用方式为print(tree.check_balance(a)),同样能解决问题。
内容的提问来源于stack exchange,提问作者Giulia Cocchi
相关产品推荐
相关产品推荐

