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
相关产品推荐
相关产品推荐

