zoukankan      html  css  js  c++  java
  • Python学习第十八课——继承,接口继承等

    1、继承:字面意思

    # 继承 : 字面意思
    
    class father:
        pass
    
    
    class grandfather:
        pass
    
    
    class children(father):  # 单继承
        pass
    
    
    class children1(father, grandfather):  # 多继承
        pass

    例子

    class Dad:
        money = 10
    
        def __init__(self, name):
            print('巴巴')
            self.name = name
    
        def hit_son(self):
            print('%s 正在打儿子' % self.name)
    
    
    class Son(Dad): # 继承
        pass
    
    print(Son.money) # 10
    s1=Son('爸爸') # 巴巴
    Son.hit_son(s1) # 爸爸 正在打儿子
    print(s1.money) # 10

    那么什么时候用继承什么时候用组合那?
    1、当类之间又显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
    2、当类之间有很多的功能,提供这些共同的功能能做成基类,用继承比较好

    # 伪代码
    class Animal:  #父类
        def eat(self):
            print('')
    
        def drink(self):
            print('')
    
        def shit(self):
            print('')
    
        def pee(self):
            print('')
    
    
    class Cat(Animal): # 子类
        def __init__(self, name):  # 派生
            self.name = name
    
        def cry(self): # 派生
            print('喵喵叫')
    
    
    class Dog(Animal): # 子类
        def __init__(self, age): # 派生
            self.age = age
    
        def look_door(self): #派生
            print('看门')

    2、接口继承

    import abc
    
    # 接口继承:父类如果是通过abc模块实现的接口,那么继承它的子类必须实现父类中的方法,不然无法实例化对象
    # 接口继承主要负责规范子类
    class All_file(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def read(self):
            pass
    
        @abc.abstractmethod
        def write(self):
            pass
    
    
    class Disk(All_file):
        def read(self):
            print('disk read')
    
        def write(self):
            print('disk write')
    
    
    class CDrom(All_file):
        def read(self):
            print('CDrom read')
    
        def write(self):
            print('CDrom write')
    
    
    class Mem(All_file):
        def read(self):
            print('Mem read')
        def write(self):
            print('Mem write')
    
    # m1=Mem()
    # m1.read() # Mem read
    # m1.write() # 此处调用为父类  write方法
    
    m1=Mem() #此时 会报错 因为 Mem中没有write 方法
    m1.read() # Mem read
    m1.write() # Mem write

    3、子类调用父类的方法 就是用父类.父类方法名字() 或者 用 super

    方法1 ——父类.父类方法名字()

    class Vehicle:
        Country='China'
        def __init__(self,name,speed,load,power):
            self.name=name
            self.speed=speed
            self.load=load
            self.power=power
    
        def run(self):
            print('开动啦')
    
    class Subway(Vehicle):
        def __init__(self,name,speed,load,power,line):
            # self.name = name
            # self.speed = speed
            # self.load = load
            # self.power = power
            Vehicle.__init__(self,name,speed,load,power) # 子类调用父类的init方法
    
            self.line=line
        def show_info(self):
            print(self.name,self.line,self.speed,self.load,self.power)
    
        def run(self):
            Vehicle.run(self)  # 开动啦  这里也是 子类调用了父类的方法
            print('%s %s线 开动了' %(self.name,self.line))
    line13=Subway('北京地铁','10km/s',1000000,'',13)
    
    line13.show_info() # 北京地铁 13 10km/s 1000000 电
    
    line13.run() # 北京地铁 13线 开动了

    方法2——super

    # 方法2 super
    class Vehicle:
        Country = 'China'
    
        def __init__(self, name, speed, load, power):
            self.name = name
            self.speed = speed
            self.load = load
            self.power = power
    
        def run(self):
            print('开动啦')
    
    
    class Subway(Vehicle):
        def __init__(self, name, speed, load, power, line):
            # self.name = name
            # self.speed = speed
            # self.load = load
            # self.power = power
    
            super().__init__(name, speed, load, power)  # 用super 调用父类 方法 不需要加 self
            self.line = line
            #super(Subway,self).__init__(name, speed, load, power) # 也可以这样写  和上面一样
    
    
        def show_info(self):
            print(self.name, self.line, self.speed, self.load, self.power)
    
        def run(self):
            super().run()  # 用super 调用父类 方法 不需要加self
            print('%s %s线 开动了' % (self.name, self.line))
    
    
    line13 = Subway('北京地铁', '10km/s', 1000000, '', 13)
    
    line13.show_info()  # 北京地铁 13 10km/s 1000000 电
    
    line13.run()  # 北京地铁 13线 开动了
  • 相关阅读:
    [BZOJ 3144][HNOI 2013] 切糕
    吴裕雄 python 机器学习——模型选择参数优化暴力搜索寻优GridSearchCV模型
    吴裕雄 python 机器学习——模型选择参数优化随机搜索寻优RandomizedSearchCV模型
    吴裕雄 python 机器学习——模型选择验证曲线validation_curve模型
    吴裕雄 python 机器学习——模型选择学习曲线learning_curve模型
    吴裕雄 python 机器学习——模型选择回归问题性能度量
    吴裕雄 python 机器学习——模型选择分类问题性能度量
    吴裕雄 python 机器学习——模型选择数据集切分
    吴裕雄 python 机器学习——模型选择损失函数模型
    吴裕雄 python 机器学习——数据预处理字典学习模型
  • 原文地址:https://www.cnblogs.com/pyhan/p/12312532.html
Copyright © 2011-2022 走看看