# 继承的初识 # # # 面向对象的三大特性 继承,封装,多态 # # # 继承 # # # # class Animal: # # breath = "呼吸" # # def __init__(self, name, sex, age): # # self.name = name # # self.sex = sex # # self.age = age # # # # def sleep(self): # # print("睡觉") # # return -1 # # # # class Person(Animal): # 括号里面的为父类,基类,超类。括号外面的子类,派生类 # # pass # # # # # # p1 = Person("ly", "m", 99) # # # # # 子类以及子类实例化的对象可以访问父类的任意属性或者方法 # # print(p1.__dict__) # # print(Person.breath) # # print(p1.sleep()) # 实例对象·现在本类里面找,找不到就去父类,再找不到就去更上层的类。值到基类 # # # # # class Animal: # def __init__(self, name, sex, age): # self.name = name # self.sex = sex # self.age = age # # def eat(self, a1): # print("{}吃{}".format(self.name,a1)) # # def sleep(self): # print("{}睡".format(self.name)) # # def shit(self): # print("{}拉".format(self.name)) # # class Dog(Animal): # # def barking(self): # print("犬吠") # # # class Duck(Animal): # # def swimming(self): # print("鸭泳") # # class Cat(Animal): # # def meow(self): # print("猫叫") # # # dog1 = Dog("嘟嘟", "s", 6) # # dog1.sleep() # # dog1.barking() # # # # # 既要执行子类的方法,也要执行父类的方法 # # # class Bird(Animal): # def __init__(self, sex, name, age, wing): # 这里可以看作是5个形参 # # 第一种方法,不常用 # # Animal.__init__(self, name, sex, age) # 这里把前四个实参交给父类的方法执行 # # # 第二种 # # super(Bird, self).__init__(name,sex,age) # # 可以简写为 # super().__init__(name,age,sex) #常用 # self.wing = wing # # def eat(self,argv): # super().eat(argv) # print("11是头猪") # b1 = Bird("公", "扁嘴", "6", "红翅膀,") # b1.eat("猪") # 继承的进阶 #继承:但继承,多继承 # 经典类,新式类。凡是继承Object都是新式类,python3中都是新式类,都默认继承Objecr, python2重默认不继承object,但可以手动继承 # 单继承。经典类和新式类查询一样,都是从下往上找 # class A: # def func(self): # print("In A") # # class B(A): # def func(self): # print("In B") # # class C(B): # # def func(self): # # print("In C") # pass # c1 = C() # c1.func() # 多继承。 对于新式类遵循广度优先(钻石继承), 经典类 深度优先 class A: # def func(self): # print("In A") pass class B(A): # def func(self): # print("In B") pass class C(A): def func(self): print("In C") pass class G(A): # def func(self): # print("In G") pass class D(B,G): # def func(self): # print("In D") pass class E(C): def func(self): print("In E") pass class F(D,E): # def func(self): # print("In F") pass f = F() f.func() # 广度优先每个节点只走一次.如果后面的路线可以走到那个节点,则之前不会去走 print(F.mro()) # 可以查询继承类的顺序, # 广度优先[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.G'>, <class '__main__.A'>, <class 'object'>] # 深度优先需要在python2 里面尝试 F ,D,B,A,G, E,C, #只能是继承两个类的情况(继承两个类以上太复杂的则看mro吧) # 广度优先一条线路走到倒数第二级,判断最后一级其他路能不能到达,如果能,则不走,不能,则走 # 深度优先,一条线路走到底 # 继承的优点: 1.节省代码 2.规范代码 只执行类的方法 只执行父类的方法 执行本类和父类的方法 父类名.方法名(参数) super().方法名(参数)