练习35(继承与继承的重用性、继承与派生、抽象类、多继承、新式类和经典类)

练习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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值