TypeError:未绑定方法

2024-09-06 15:12
文章标签 方法 绑定 typeerror

本文主要是介绍TypeError:未绑定方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TypeError: unbound method 错误通常发生在类方法被调用时,但没有正确绑定到实例。这通常意味着你试图在类本身上调用一个实例方法,或者没有使用正确的方式创建类实例。

在这里插入图片描述

1、问题背景

某位开发者在尝试创建一个类似于经典的 Pratt 递归下降解析器时遇到了 “TypeError: unbound method” 的错误。在简化了代码之后,开发者发现问题出在对中缀运算符的处理上,具体来说是 infix_led 函数没有正确绑定到 symbol 类的实例。

2、解决方案:

有两种解决方案:

方法1:
tokenize() 函数中,每当遇到一个非数字的运算符时,不直接生成一个 symbol 类,而是生成一个 symbol() 的实例。这确保了每个运算符都有一个单独的实例,可以绑定各自的 led 函数。

方法2:
使用 types.MethodType 函数将 infix_led 函数绑定到 symbol 类的实例上。这是一种更显式的绑定方式,也确保了每个运算符都有一个单独的实例,可以绑定各自的 led 函数。

代码示例:

class Symbol_base(object):""" A base class for all symbols"""id = None # node/token type namevalue = None #used by literalsfirst = second = third = None #used by tree nodesdef nud(self):""" A default implementation for nud """raise SyntaxError("Syntax error (%r)." % self.id)def led(self,left):""" A default implementation for led """raise SyntaxError("Unknown operator (%r)." % self.id)def __repr__(self):if self.id == "(name)" or self.id == "(literal)":return "(%s %s)" % (self.id[1:-1], self.value)out = [self.id, self.first, self.second, self.third]out = map(str, filter(None,out))return "(" + " ".join(out) + ")"symbol_table = {}
def symbol(id, bindingpower=0):""" If a given symbol is found in the symbol_table return it.If the symblo cannot be found theni create the appropriate classand add that to the symbol_table."""try:s = symbol_table[id]except KeyError:class s(Symbol_base):passs.__name__ = "symbol:" + id #for debugging purposess.id = ids.lbp = bindingpowersymbol_table[id] = selse:s.lbp = max(bindingpower,s.lbp)return sdef infix(id, bp):""" Helper function for defining the symbols for infix operations """def infix_led(self, left):self.first = leftself.second = expression(bp)return selfsymbol(id, bp).led = infix_led#define all the symbols
infix("+", 10)
symbol("(literal)").nud = lambda self: self #literal values must return the symbol itself
symbol("(end)")token_pat = re.compile("\s*(?:(\d+)|(.))")def tokenize(program):for number, operator in token_pat.findall(program):if number:symbol = symbol_table["(literal)"]s = symbol()s.value = numberyield selse:symbol = symbol_table.get(operator)if not symbol:raise SyntaxError("Unknown operator")yield symbol()symbol = symbol_table["(end)"]yield symbol()def expression(rbp = 0):global tokent = tokentoken = next()left = t.nud()while rbp < token.lbp:t = tokentoken = next()left = t.led(left)return leftdef parse(program):global token, nextnext = tokenize(program).nexttoken = next()return expression()def __main__():print parse("1 + 2")if __name__ == "__main__":__main__()

在这个代码示例中,tokenize() 函数生成 Symbol_base 类的实例,并且使用 types.MethodType() 函数将 infix_led 函数绑定到每个实例上。这样就确保了每个运算符都有一个单独的实例,并且他们的 led 函数都正确绑定到了各自的实例上。

如果你遇到 TypeError: unbound method 错误,请确保你正确地实例化类,并通过实例调用方法。如果确实需要通过类调用方法,请使用 @classmethod@staticmethod 装饰器。

希望这个解释和解决方案对你有所帮助。

这篇关于TypeError:未绑定方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142362

相关文章

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j