如何获取类实例化时传入的参数个数?自定义错误实现求助
解决Point类自定义参数校验错误的问题
看起来你在实现Point类的参数校验时,卡在了参数长度判断这一步——我猜你可能是用了固定参数(比如def __init__(self, x, y))然后试图去判断参数个数,这种情况下Python会在进入__init__之前就抛出参数不匹配的TypeError,你自然没法在方法内部获取到实际传入的参数长度。
下面给出两种正确的实现方式,都包含自定义错误的触发逻辑:
1. 先定义自定义异常类
首先我们先创建一个专属的自定义异常,让错误信息更清晰直观:
class InvalidPointError(Exception): """当创建Point实例的参数不符合要求时触发的自定义异常""" pass
2. 方式一:固定参数+类型校验(个数错误由Python原生处理)
如果希望严格要求调用者传入两个参数,这种写法更简洁:参数个数错误会由Python抛出原生TypeError,类型错误则抛我们的自定义异常:
class Point: def __init__(self, x, y): # 校验参数是否为数字类型(整数或浮点数) if not (isinstance(x, (int, float)) and isinstance(y, (int, float))): raise InvalidPointError("Point的参数必须是整数或浮点数") self.x = x self.y = y
3. 方式二:可变参数+全自定义校验(个数和类型统一抛自定义异常)
如果你希望把参数个数错误也统一抛自定义异常,那可以用*args来接收所有传入的参数,这样就能自己控制参数长度的判断:
class Point: def __init__(self, *args): # 先校验参数个数是否符合要求 if len(args) != 2: raise InvalidPointError(f"创建Point需要传入2个参数,你传入了{len(args)}个") x, y = args # 再校验参数是否为数字类型 if not (isinstance(x, (int, float)) and isinstance(y, (int, float))): raise InvalidPointError("Point的参数必须是整数或浮点数") self.x = x self.y = y
测试示例
# 测试参数个数错误 try: Point(1) except InvalidPointError as e: print(e) # 输出: 创建Point需要传入2个参数,你传入了1个 # 测试参数类型错误 try: Point("a", 2) except InvalidPointError as e: print(e) # 输出: Point的参数必须是整数或浮点数 # 正常创建实例 p = Point(3.5, 5) print(p.x, p.y) # 输出: 3.5 5
之前的写法错误大概率是因为用了固定参数却想在方法内部判断参数个数——这种场景下Python会先拦截参数不匹配的情况,根本不会进入你的__init__方法,自然没法获取到正确的传入参数长度。用可变参数*args就能完美解决这个问题啦。
内容的提问来源于stack exchange,提问作者incognita
相关产品推荐
相关产品推荐

