练习35
# 面向对象的三大特性
# 继承
# 继承喝抽象 俩个概念
# 单继承
# 语法 : 父类 子类
# 继承与重用
# 子类可以使用父类中的名字(变量和方法)
# 继承与派生
# 子类在父类的基础上又新创建了自己需要的方法和属性
# 父类有的子类没有 - 子类对象直接调用 就会直接执行父类的方法
# 父类有的子类也有 - 子类对象调用 直接执行子类中的方法
# 想在子类中使用父类的名字:父类名、super()去调用
# 规范的变成模式
# 抽象类
# 多继承
# 语法
# 接口类
# 新式类和经典类
# 新式类中
# 在新式类中 所有的多继承关系寻找方法的顺序 - 都遵循广度优先
# 继承object
# mro 方法
# super: super不是单纯的找父类,而是遵循mro顺序的
# 经典类
# python2.x
# 不主动继承object
# 静待鸟类在找父类中方法的过程中 遵循 - 深度优先
# 多态
#
# 封装
# c
# c++ c# java python
# 继承的例子
# 游戏
# 梅西 奥巴马 史努比 史派克 小猪佩奇 猪八戒 # 实例
# 人 狗 猪 # 分类
# 动物 # 汇总
# 先抽象 后继承
# 猫类
# 属性:名字,品种,食物
# 方法:叫声,抓老鼠,吃,喝
# 够类
# 属性:名字,品种,食物
# 方法:叫,看家,吃,喝
# class Animal:
# def __init__(self,name,kind,food,language):
# self.name = name
# self.kind = kind
# self.food = food
# self.language = language
# def yell(self):
# print('%s叫' % (self.language))
# def eat(self):
# print('吃%s' % (self.food))
# def drink(self):
# print('喝水')
#
# class Cat(Animal):
# def catch_mouse(self):
# print('抓老鼠')
#
# class Dog(Animal):
# def look_after_house(self):
# print('看家')
# 继承
# 父类、超类、基类 :Animal
# 子类 派生类 :Cat、Dog
# 继承与重用 - 父类中所有的属性和方法都可以被子类使用了
# 阿猫 = Cat('阿猫', '橘猫', '牛杂', '喵喵')
# print(阿猫.name)
# 阿猫.drink()
# 阿猫.eat()
# 阿猫.yell()
#
# 阿狗 = Dog('阿狗', '土狗', '阿猫', '汪汪')
# print(阿狗.name)
# 阿狗.drink()
# 阿狗.eat()
# 阿狗.yell()
# 派生
# class Animal:
# def __init__(self,name,kind,food,language):
# print('in Animal')
# self.name = name
# self.kind = kind
# self.food = food
# self.language = language
# def yell(self):
# print('%s叫' % (self.language))
# def eat(self):
# print('吃%s' % (self.food))
# def drink(self):
# print('喝水')
#
# class Cat(Animal): # Amimal的派生类
# def __init__(self,name,kind,food,language,eye_color):
# print('in Cat')
# self.eye_color = eye_color # 派生属性
# # Animal.__init__(self,name,kind,food,language)
# super().__init__(name,kind,food,language)
#
# def catch_mouse(self): # 派生方法
# print('抓老鼠')
#
# def eat(self): # 不仅执行了父类中的基础功能,还完成了特殊的功能
# # Animal.eat(self)
# super().eat()
# self.weight = 10
#
# class Dog(Animal):
# def look_after_house(self): # 派生方法
# print('看家')
# def eat(self):
# # Animal.eat(self)
# super().eat()
# self.drink()
#
# 阿猫 = Cat('阿猫', '橘猫', '牛杂', '喵喵','绿色')
# print(阿猫.eye_color)
# print(阿猫.food)
# 阿猫.catch_mouse()
# 阿猫.eat()
# print(阿猫.weight)
# 当子类当中有要被调用的方法的时候,子类的对象会直接选择子类中的方法、变量 父类中的方法不会被自动执行
# 如果我们既想要执行子类的方法,也想要执行父类的方法,那么需要在子类的方法中要调用父类的方法
# 父类名.方法名(self...)
# super().方法名(...)
# 帮助我们在子类中调用父类中的同名方法
# 面试题
# class Foo:
# def __init__(self):
# self.func()
# def func(self):
# print('in Foo')
#
# class Son(Foo):
# def func(self):
# print('in Son')
#
# s1 = Son()
# class Foo:
# Country = 'China'
# def func(self):
# print(self.Country)
#
# class Son(Foo):
# Country = 'English'
# def func(self): # 走的这个方法
# print(self.Country)
#
# s = Son()
# s.func()
# class Foo:
# Country = 'China'
# def func(self): # 走的这个方法
# print(self.Country)
#
# class Son(Foo):
# Country = 'English'
#
# s = Son()
# s.func() # English
# class Foo:
# Country = 'China'
# def func(self):
# print(self.Country)
#
# class Son(Foo):
# pass
#
# s = Son()
# s.func() # China
# 工作中 公司有使用抽象类开发的规则
# 源码 别人使用抽象类
# 支付功能
# from abc import ABCMeta,abstractmethod
# class Payment(metaclass=ABCMeta): # 模板的功能
# @abstractmethod # abstractmethod 是一个装饰器,装饰器怎么用? 放在函数或者类的上一行
# def pay(self):
# pass
# # @abstractmethod
# # def shouqian(self):
# # pass
#
# class Alipay(Payment):
# def pay(self,money):
# print('使用支付宝支付了%s元' % money)
#
# class Wechatpay(Payment):
# def pay(self,money):
# print('使用微信支付了%s元' % money)
#
# class Applepay(Payment):
# def pay(self,money):
# print('使用苹果支付了%s元' % money)
#
# def pay(obj,money):
# obj.pay(money)
#
# a = Alipay()
# # a.pay(100)
# pay(a,100)
#
# we = Wechatpay()
# # we.pay(200)
# pay(we,200)
#
# ap = Applepay()
# 规范
# 多人开发 复杂的需求 后期的扩展
# 抽象类
# 抽象类是一个规范,它基本不会实现什么具体的功能,抽象类是不能实例化的
# 要想写一个抽象类,
# from abc import ABCMeta,abstractmethod
# 在这个类创建的时候指定 metaclass=ABCMeta
# 在你希望子类实现的方法上上加上一个 @abstractmethod 装饰器
# 使用抽象类
# 继承这个类
# 必须实现这个类被 @abstractmethod 装饰器装饰的方法
# 多继承
# class Parent1:pass
# class Parent2:pass
# class Son(Parent1,Parent2):pass
# print(Son.__bases__)
# 不是所有的语言都支持多继承 比如 java
# c++ 支持多继承
# 天鹅 飞 游泳 走路
# 老虎 走路 游泳
# 鹦鹉 飞 说话 走路
# class Animal:
# def __init__(self,name):
# self.name = name
# def talk(self):
# print('%s说话了' % self.name)
#
# def swim(self):
# print('%s在游泳' % self.name)
#
# def fly(self):
# print('%s在飞' % self.name)
#
# def walk(self):
# print('%s在走路' % self.name)
# class Animal:
# def __init__(self,name):
# self.name = name
#
# class FlayAnimal(Animal):
# def fly(self):
# print('%s在飞' % self.name)
# class WalkAnimal(Animal):
# def walk(self):
# print('%s在走路' % self.name)
# class SwimAnimal(Animal):
# def swim(self):
# print('%s在游泳' % self.name)
#
# class Tiger(SwimAnimal,WalkAnimal):
# pass
# class Swan(FlayAnimal,WalkAnimal,SwimAnimal):
# pass
# class Parrot(FlayAnimal,WalkAnimal,):
# def talk(self):
# print('%s说话了' % self.name)
#
# swan = Swan('天鹅')
# # swan.talk()
# swan.fly()
# swan.walk()
# 接口类
# java c#
# 不允许多继承
# 接口 Interface 接口可以被多继承
# Interface FlyAnimal: # 规范继承我的类必须实现这个方法
# def fly(): pass
# Interface WalkAnimal:
# def walk(): pass
# Interface SwimAnimal:
# def swim(): pass
# class Tiger(WalkAnimal,SwimAnimal): 继承了一个规范
# def walk(): 代码
# def swim(): 代码
# 抽象类
# 接口
# 新式类
# 在python3.x版本中 所有的类都是新式类
# 所有的新式类都有一个默认的父类: object
# class Person1(object):pass
# class Person2:pass
# class Person3():pass
# p = Person() # __init__ 初始化方法
# print(Person1.__bases__)
# print(Person2.__bases__)
# print(Person3.__bases__)
# python2.7
# 经典类 和 新式类
# class Student:pass # 经典类
# class Student(object):pass # 经典类
# 继承了object的类就是新式类
# 在python3中所有的类都是新式类
# 在python3中既有新世类又有经典类
# 多继承的顺序 在新式类和经典类之间的区别
# class A:
# def func(self):
# print('A')
# class B(A):
# pass
# # def func(self):
# # print('B')
# class C(A):
# pass
# # def func(self):
# # print('C')
# class D(B,C):
# pass
# # def func(self):
# # print('D')
# print(D.mro())
# d = D()
# d.func()
# 新式类中
# 在新式类中 所有的多继承关系寻找方法的顺序 - 都遵循广度优先
# 继承object
# mro 方法
# super: super不是单纯的找父类,而是遵循mro顺序的
# class A:
# def func(self):
# print('A')
# class B(A):
# def func(self):
# super().func()
# print('B')
# class C(A):
# def func(self):
# super().func()
# print('C')
# class D(B,C):
# def func(self):
# super().func()
# print('D')
#
# D().func()
# print(D.mro())
# B().func()
# 经典类
# python2.x
# 不主动继承object
# 静待鸟类在找父类中方法的过程中 遵循 - 深度优先
# class A(object):
# pass
# def func(self):
# print('A')
# class B(A):
# pass
# def func(self):
# A.func(self)
# print('B')
# class C(A):
# pass
# def func(self):
# print('C')
# class D(B,C):
# pass
# # def func(self):
# # print('D')
# D().func()