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

Python如何访问类中未在__init__方法内定义的实例变量?

报错原因

你的报错和「c、d没在__init__里定义」没有关系,核心问题是类的t方法没有写返回值,Python中无显式return的方法默认返回None,你写的SecondTest.t(30,40).c相当于先拿到t方法返回的None,再尝试从None上读取c属性,自然会抛出'NoneType' object has no attribute 'c'的错误。
实际上只要t方法执行过,方法里给self.c、self.d赋值的语句就会把这两个属性绑定到实例上,完全可以正常访问。

可行访问方式

你可以任选以下两种方式实现访问:

方式1:分开调用方法和访问属性

先执行实例的t方法完成属性绑定,再直接通过实例访问c、d即可,不需要修改原有类的代码:

SecondTest = test(3,4)
SecondTest.t(30,40)  # 执行方法,完成c、d属性绑定
print(SecondTest.c)  # 输出30
print(SecondTest.d)  # 输出40

方式2:修改方法支持链式调用

如果你想保留原来链式调用的写法,只需要在t方法末尾加return self,让方法返回当前实例本身即可:

class test:
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def t(self,c,d):
        self.c = c
        self.d = d
        return self # 返回当前实例,支持链式调用

# 原有写法可直接正常运行
SecondTest = test(3,4)
print(SecondTest.t(30,40).c) # 输出30
注意事项

*Python实例属性不强制要求必须在__init__方法中定义,只要对应给self.属性名赋值的方法被执行过,实例就会持有该属性。如果要避免「未调用t方法就访问c/d触发属性不存在错误」,可以在__init__中提前给c、d设置默认初始值:

class test:
    def __init__(self,a,b):
        self.a = a
        self.b = b
        # 提前定义c、d默认值
        self.c = None
        self.d = None
    def t(self,c,d):
        self.c = c
        self.d = d

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:09:18