Python类属性传入符合类型参数仍触发类型异常问题排查
问题根因
你的代码有两处错误,直接触发了这个异常:
- 类型校验逻辑写反了:
if type(value) != int or type(value) != float是永真条件。不存在一个值能同时是int和float,所以不管你传什么类型,两个判断里总有一个为真,or连接的条件只要有一个成立就会进入异常分支。举个例子,你传入3.25(float类型)时,type(value) != int的结果是True,or运算直接判定整个条件成立,立刻触发类型异常,根本不会走到后面的float类型判断分支。 - 重复定义了density属性:你先用
property(operator.attrgetter('_density'))定义了一次density,后面又用@property装饰器重写了同名属性,前面那句是完全冗余的无效代码,会被后定义的属性覆盖,留着反而容易引发属性访问冲突。
修正方案
- 删掉冗余的那行
density = property(operator.attrgetter('_density')),连带没用的import operator也可以删掉 - 把类型判断的逻辑改成「值既不是int也不是float时抛错」,更推荐用
isinstance做类型判断,可以兼容int/float的子类场景,比直接比对type()更鲁棒。
修正后的完整代码:
class dummy: def __init__(self, density): self.density = density @property def density(self): return self._density @density.setter def density(self, value): if not isinstance(value, (int, float)): raise Exception("density must be int or float types!") elif value <= 0: raise Exception("density must be non-zero and positive!") self._density = value
验证
执行实例化代码dev = dummy(density = 3.25)可以正常创建对象,访问dev.density会正常返回3.25;如果传入字符串、列表等非数值类型,或者传入0、负数,会按预期抛出对应异常。
内容的提问来源于stack exchange,提问作者Nithin K
相关产品推荐
相关产品推荐

