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线 开动了

 

posted @ 2020-02-15 16:33  PY憨  阅读(146)  评论(0编辑  收藏  举报