欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python基础入门之十六 —— 继承

程序员文章站 2022-06-27 20:16:34
一、定义 python面对对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所由属性和方法。 class A(object): def __init__(self): self.num=1 def info_print(self): print(self.num) #子类B class B( ......

一、定义

python面对对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所由属性和方法

class a(object):
    def __init__(self):
        self.num=1
    def info_print(self):
        print(self.num)

#子类b
class b(a):
    pass

resoult=b()
resoult.info_print()  #1

二、单继承和多继承

  • 单继承:
  • 多继承:一个类同时继承多个父类

p.s:当一个类有多个父类得时候,同名属性和方法默认使用第一个父类的。

class a(object):
    def __init__(self):
        self.str = 'a类的初始定义'

    def print_str(self):
        print(f'运用{self.str}')

class b(object):
    def __init__(self):
        self.str = 'b类的初始定义'

    def print_str(self):
        print(f'运用{self.str}')

class c(a, b):
    pass

class d(b, a):
    pass

c = c()
c.print_str()  # 运用a类的初始定义
d = d()
d.print_str()  # 运用b类的初始定义

三、子类重写父类同名方法和属性

子类和父类具有同名属性和方法,默认使用子类的同名属性和方法

class a(object):
    def __init__(self):
        self.str = 'a类的初始定义'

    def print_str(self):
        print(f'运用{self.str}')

class b(object):
    def __init__(self):
        self.str = '子类b类的初始定义'

    def print_str(self):
        print(f'运用{self.str}')

b = b()
b.print_str()  # 运用子类b类的初始定义

四、子类调用父类的同名方法和属性

class a(object):
    def __init__(self):
        self.str = 'a类的初始定义'

    def print_str(self):
        print(f'运用{self.str}')

class b(object):
    def __init__(self):
        self.str = 'b类的初始定义'

    def print_str(self):
        print(f'运用{self.str}')

class c(a, b):
    def __init__(self):
        self.str = '子类c类的初始定义'

    def print_str(self):
        print(f'运用{self.str}')

    def print_self_str(self):
        self.__init__()
        self.print_str()
        # self即函数本身,这里前面调用了self参数,括号里就不用写了
        # self.print_str(self) 传了两遍参数会报错

    def print_a_str(self):
        a.__init__(self)
        a.print_str(self)

    def print_b_str(self):
        b.__init__(self)
        b.print_str(self)

c = c()
c.print_str()  # 运用子类c类的初始定义
c.print_self_str()  # 运用子类c类的初始定义
c.print_a_str()  # 运用a类的初始定义
c.print_b_str()  # 运用b类的初始定义
c.print_str()  # 运用b类的初始定义
c.print_self_str()  # 运用子类c类的初始定义
# 前后两个print_str()输出值不一样,因为该函数没有重新初始化self.str

# __mro__查看继承顺序
print(c.__mro__)  
# (<class '__main__.c'>, <class '__main__.a'>, <class '__main__.b'>, <class 'object'>)

五、多层继承

eg:c类继承b类,b类继承a类,像这种三代及以上的叫多层继承。规则同继承

六、super调用父类方法

使用super()可以自动查找父类。调用顺序遵循__mro__类属性的顺序。比较适合单继承使用。

class a(object):
    def __init__(self):
        self.str='a类的初始定义'
    def print_str(self):
        print(f'运用{self.str}')

class b(a):
    def __init__(self):
        self.str = 'b类的初始定义'

    def print_str(self):
        # 1、 super()带参数
        # super(b, self).__init__()
        # super(b, self).print_str()
        # 2、 super()无参数
        super().__init__()
        super().print_str()

class c(b):
    def __init__(self):
        self.str= 'c类的初始定义'

    def print_str(self):
        # 1、 super()带参数
        # super(c,self).__init__()
        # super(c,self).print_str()
        # 2、 super()无参数
        super().__init__()
        super().print_str()

c = c()
c.print_str()  # 运用a类的初始定义

七、私有权限

  • 不能继承给子类的属性和方法需要添加私有权限
  • 私有权限不能在外部直接输出或使用
  • 语法:私有属性和方法区别在名字前面加两个下划线
class 类名():
    #私有属性
    __属性名 = 值
   # 私有方法
    def  __函数名(self):
       代码