结论:
子类会继承父类,并覆盖父类的变量和实例方法,所以实例方法要注意区分命名
class Class_1():
def __init__(self):
self.var_1 = "实例变量"
var_1 = "类变量"
var_2 = "类变量"
obj = Class_1()
obj.var_1 # '实例变量'
obj.var_2 # '类变量'
# 类变量被同名实例变量覆盖,与顺序无关
class Class_1():
var_1_1 = "类变量"
var_1_2 = "类变量_被覆盖"
var_1_3 = "类变量"
def __init__(self):
self.var_1_1 = Class_1.var_1_1 + "_变成实例变量" # 调用类变量
self.var_1_2 = "实例变量_覆盖类变量"
self.var_1_4 = "实例变量"
class Class_2(Class_1): # 继承父类(如无继承,无法调用)
# 子类的类变量_继承父类的类变量
var_2_1 = Class_1.var_1_1 + "_被继承"
var_2_2 = Class_1.var_1_2 + "_被继承"
var_2_3 = Class_1.var_1_3 + "_被继承"
# var_2_4 = Class_1.var_1_4 # 无法继承父类的实例变量
def __init__(self):
super().__init__() # 调用父类的构造函数
self.var_3_1 = self.var_1_1 + "_被继承"
self.var_3_2 = self.var_1_2 + "_被继承"
self.var_3_3 = self.var_1_3 + "_被继承"
self.var_3_4 = self.var_1_4 + "_被继承"
obj = Class_2()
print("实例变量覆盖同名类变量")
print("var_1_1", obj.var_1_1)
print("var_1_2", obj.var_1_2)
print("var_1_3", obj.var_1_3)
print("var_1_4", obj.var_1_4)
print("\n类变量_只继承父类的类变量")
print("var_2_1", obj.var_2_1)
print("var_2_2", obj.var_2_2)
print("var_2_3", obj.var_2_3)
print("\n实例变量_均继承")
print("var_3_1", obj.var_3_1)
print("var_3_2", obj.var_3_2)
print("var_3_3", obj.var_3_3)
print("var_3_4", obj.var_3_4)
https://cloud.tencent.com/developer/article/1915788
修改代码以解决报错
class Class_1():
var_1 = 1
def __init__(self):
self.var_2 = var_1
class Class_2(Class_1):
def __init__(self):
self.var_4 = self.var_2
obj = Class_2()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[21], line 12
9 def __init__(self):
10 self.var_4 = self.var_2
---> 12 obj = Class_2()
Cell In[21], line 10, in Class_2.__init__(self)
9 def __init__(self):
---> 10 self.var_4 = self.var_2
AttributeError: 'Class_2' object has no attribute 'var_2'
在这段代码中,报错是因为在Class_2的构造函数中,你尝试访问self.var_2,但是var_2并不存在于Class_2中。这是因为var_2是Class_1的实例变量,而不是Class_2的实例变量。
要解决这个问题,你可以在Class_2的构造函数中调用父类(Class_1)的构造函数,以确保var_2被正确地初始化。你可以使用super()函数来实现这一点。修改后的代码如下所示:
class Class_1():
var_1 = 1
def __init__(self):
self.var_2 = Class_1.var_1
class Class_2(Class_1):
def __init__(self):
super().__init__() # 调用父类的构造函数
self.var_4 = self.var_2
obj = Class_2()
通过调用super().__init__(),你可以确保Class_1的构造函数被调用,从而正确初始化var_2。现在,你应该能够成功创建Class_2的实例对象,而不会再出现AttributeError的错误。
修改代码以解决报错
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[22], line 7
4 def __init__(self):
5 self.var_2 = var_1
----> 7 class Class_2(Class_1):
8 var_3 = var_1
10 obj = Class_2()
Cell In[22], line 8, in Class_2()
7 class Class_2(Class_1):
----> 8 var_3 = var_1
NameError: name 'var_1' is not defined
在这段代码中,报错是因为在Class_2的定义中,你尝试访问var_1,但是var_1并没有在Class_2的作用域中定义。这导致了NameError。
要解决这个问题,你可以使用Class_1.var_1来访问Class_1中的var_1变量。这样可以确保在Class_2中正确引用父类的变量。修改后的代码如下所示:
class Class_1():
var_1 = 1
def __init__(self):
self.var_2 = Class_1.var_1
class Class_2(Class_1):
var_3 = Class_1.var_1
obj = Class_2()
通过使用Class_1.var_1,你可以在Class_2中正确引用父类的变量。现在,你应该能够成功创建Class_2的实例对象,而不会再出现NameError的错误。