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

如何创建类:__new__返回其他对象时仍可访问类自身属性

解决方法

方案1:继承目标类型(适用于可继承的内置类型)

如果要返回的对象是可继承的内置类型(比如list),直接让你的类继承该类型即可。这样实例化后得到的是当前类的实例,既具备目标类型的功能,又能访问自身类的属性:

class myClass(list):
    myProperty = "This is the myClass property."

    def __new__(cls):
        # 调用父类的__new__创建实例,传入初始化参数
        return super().__new__(cls, "Hello World")

# 测试
obj = myClass()
print(obj.myProperty)  # 输出: This is the myClass property.
print(obj[0])          # 输出: H
print(len(obj))        # 输出: 11

方案2:包装目标对象(通用方案)

如果要返回的对象类型无法直接继承,或者你不想让类继承该类型,可以通过包装+属性代理的方式实现:

class myClass:
    myProperty = "This is the myClass property."

    def __new__(cls):
        # 创建当前类的实例
        instance = super().__new__(cls)
        # 将目标对象作为实例的内部属性存储
        instance._wrapped_obj = list("Hello World")
        return instance

    # 当访问实例自身没有的属性/方法时,代理到包装的对象
    def __getattr__(self, name):
        return getattr(self._wrapped_obj, name)

# 测试
obj = myClass()
print(obj.myProperty)  # 输出类属性
print(obj[0])          # 代理访问list的元素
print(obj.count('l'))  # 代理调用list的方法

原代码报错原因

你的原代码中,__new__直接返回了一个list实例,这意味着myClass()得到的是一个纯粹的list对象,而非myClass的实例。Python的属性查找规则是:先查找实例自身,再查找实例所属的类及其父类。由于这个对象的类型是list,它的属性查找链里根本不会包含myClass,所以自然找不到myProperty属性,导致报错。

内容的提问来源于stack exchange,提问作者BloxyBloxy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:22:39