python 面向对象 继承
  X5zJxoD00Cah 2023年11月02日 24 0


结论:

子类会继承父类,并覆盖父类的变量和实例方法,所以实例方法要注意区分命名

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的错误。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  lA9hNJ8xYnRP   2023年12月06日   34   0   0 构造函数Qt
  X5zJxoD00Cah   2023年11月02日   44   0   0 父类子类Python
  cnCTZTo8tgOC   2023年11月02日   34   0   0 父类字段子类
  VFWfXqj8RgC8   2023年11月02日   35   0   0 重定义父类子类
X5zJxoD00Cah