You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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装饰器重写了同名属性,前面那句是完全冗余的无效代码,会被后定义的属性覆盖,留着反而容易引发属性访问冲突。
修正方案
  1. 删掉冗余的那行density = property(operator.attrgetter('_density')),连带没用的import operator也可以删掉
  2. 把类型判断的逻辑改成「值既不是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:48:24