Python OOP类内调用自定义方法报NameError的解决方案
问题原因
类中定义的实例方法,在类内部其他方法里调用时,不能直接写裸方法名调用:直接写方法名时,Python只会在当前函数的局部作用域、模块全局作用域里查找对应函数,不会自动匹配类下绑定的实例方法,自然会触发NameError: name 'function_i_use_often_within_others' is not defined。
之前尝试通过继承拆分方法仍然报错,核心原因是继承仅会把父类方法同步到子类的实例绑定关系中,子类方法内部调用时如果不通过实例本身引用方法,依然会因为作用域查找逻辑触发相同错误,和继承逻辑无关。
修复方案
类内部的实例方法互调,统一通过实例本身(也就是实例方法的第一个入参self)加.的形式调用即可,不需要在每个调用方内部嵌套定义工具方法,也不需要额外拆分工具类做继承。
修正后的可运行代码:
class testcase: def __init__(self,xpath): self.xpath = xpath def function_i_use_often_within_others(self): print('DOING SOMETHING OFTEN') def function2(self): self.function_i_use_often_within_others() print("Function2 doing something else") def function3(self): self.function_i_use_often_within_others() print("Function3 doing something else") trial = testcase('This is xpath') trial.function_i_use_often_within_others() trial.function2() trial.function3()
运行后输出符合预期:
DOING SOMETHING OFTEN DOING SOMETHING OFTEN Function2 doing something else DOING SOMETHING OFTEN Function3 doing something else
注意要点
- Python类的实例方法定义时,第一个参数固定代表当前类的实例对象,约定俗成命名为
self,这是实例访问自身属性、方法的核心入口 - 不管是在类外部调用实例方法,还是类内部其他实例方法互调,本质都是通过「实例对象.方法名()」的形式触发,类内部获取当前实例的渠道就是方法入参里的
self - 如果要定义不需要绑定实例、可以直接通过类名调用的静态方法,可以用
@staticmethod装饰器标记,这类方法不需要传self参数,类内部互调可以直接通过类名.方法名()的形式调用,但当前场景用普通实例方法加self.调用是最简洁的实现。
内容的提问来源于stack exchange,提问作者John Carr
相关产品推荐
相关产品推荐

