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