"""
    单继承,class B(A) 括号里面的是相对B来说的B的父类，集成了A的属性和方法
    1- python中类的属性是直接写在init方法中的
"""
class A(object):

    def __init__(self):
        self.num = 10

    def print_num(self):
        print(self.num + 10)

class B(A):

    def my_func(self):
        print("我自己B类的自定义方法")

b = B()
print(b.num)
b.print_num()
b.my_func()

"""
    多继承class D(C, A),如果多个父类C,A中都含有相同的方法和属性print_num那么子类D继承的是就是C的，注意继承的先后顺序
    1- 父类中的属性和方法如果相同的话，会继承第一个父类的属性和方法，按照集成的顺序走init构造方法
    2- D类中重写父类的方法,如果自己d类中重写了init方法，那么就不会继承任何的父类属性从init方法中
    3- 换句话，子类重写了父类的方法，那么不在使用父类同名的方法，包括init构造方法
    4- 子类中重写了父类的方法但是还是想调用父类的方法，
"""
class C(object):

    def __init__(self):
        self.num = 28

    def print_num(self):
        print(self.num + 10)

class D(C, A):

    def __init__(self):
        self.age = "这是D类自己的属性age"
        self.num = "这是D类重写父类的属性num"

    def print_num(self):
        self.__init__()     # 再将self.num更改回来
        print("这是D自己重写父类的方法")

    # 但是子类还是想使用**父类的属性**调用父类重名的print_num方法
    # 使用A.__init__(self)方法来更改self.num的值
    def print_a_num(self):
        print(d.num)        # 本来D对象中self.num = "这是D类重写父类的属性num"
        A.__init__(self)    # 把self传进去，当前的self.num = 10
        A.print_num(self)

    # 或者使用super在子类方法中调用父类的方法
    def print_c_num(self):
        # super(D, self).print_num()    或者下面的简写形式
        super().print_num()

    def my_func(self):
        print("我自己D类的自定义方法")

d = D()
d.print_a_num()
print(d.num)
d.print_num()


"""
    单继承,class B(A) 括号里面的是相对B来说的B的父类，集成了A的属性和方法
    1- python中类的属性是直接写在init方法中的
"""
class A(object):

    def __init__(self):
        self.num = 10

    def print_num(self):
        print(self.num + 10)

class B(A):

    def my_func(self):
        print("我自己B类的自定义方法")

b = B()
print(b.num)
b.print_num()
b.my_func()

"""
    多继承class D(C, A),如果多个父类C,A中都含有相同的方法和属性print_num那么子类D继承的是就是C的，注意继承的先后顺序
    1- 父类中的属性和方法如果相同的话，会继承第一个父类的属性和方法，按照集成的顺序走init构造方法
    2- D类中重写父类的方法,如果自己d类中重写了init方法，那么就不会继承任何的父类属性从init方法中
    3- 换句话，子类重写了父类的方法，那么不在使用父类同名的方法，包括init构造方法
    4- 子类中重写了父类的方法但是还是想调用父类的方法，
"""
class C(object):

    def __init__(self):
        self.num = 28

    def print_num(self):
        print(self.num + 10)

class D(C, A):

    def __init__(self):
        self.age = "这是D类自己的属性age"
        self.num = "这是D类重写父类的属性num"

    def print_num(self):
        self.__init__()     # 再将self.num更改回来
        print("这是D自己重写父类的方法")

    # 但是子类还是想使用**父类的属性**调用父类重名的print_num方法
    # 使用A.__init__(self)方法来更改self.num的值
    def print_a_num(self):
        print(d.num)        # 本来D对象中self.num = "这是D类重写父类的属性num"
        A.__init__(self)    # 把self传进去，当前的self.num = 10
        A.print_num(self)

    # 或者使用super在子类方法中调用父类的方法
    def print_c_num(self):
        # super(D, self).print_num()    或者下面的简写形式
        super().print_num()

    def my_func(self):
        print("我自己D类的自定义方法")

d = D()
d.print_a_num()
print(d.num)
d.print_num()


单继承,class B(A) 括号里面的是相对B来说的B的父类，集成了A的属性和方法     1- python中类的属性是直接写在init方法中的 多继承class D(C, A),如果多个父类C,A中都含有相同的方法和属性print_num那么子类D继承的是就是C的，注意继承的先后顺序     1- 父类中的属性和方法如果相同的话，会继承第一个父类的属性和方法，按照集成的顺序走init构造方法     2- D类中重写父类的方法,如果自己d类中重写了init方法，那么就不会继承任何的父类属性从init方法中     3- 换句话，子类重写了父类的方法，那么不在使用父类同名的方法，包括init构造方法     4- 子类中重写了父类的方法但是还是想调用父类的方法， # 再将self.num更改回来 # 但是子类还是想使用**父类的属性**调用父类重名的print_num方法 # 使用A.__init__(self)方法来更改self.num的值 # 本来D对象中self.num = "这是D类重写父类的属性num" # 把self传进去，当前的self.num = 10 # 或者使用super在子类方法中调用父类的方法 # super(D, self).print_num()    或者下面的简写形式