python import 类 继承_python的类的继承-接口继承-归一化设计

1、先在子类本身找,如果子类没有,会去父类找

classDad:'这个是爸爸类'money=10#Dad类的数据属性

def __init__(self,name):print("爸爸")

self.name=namedefhit_son(self):print("%s 正在打儿子" %self.name)classSon(Dad):pass

print(Son.money)#继承父类的数据属性

s1=Son("gouguoqi")#实例化的时候因为本身没有,所以会触发父类的init#Son.hit_son()#print(Dad.__dict__)#打印父类的属性字典#print(Son.__dict__)

C:\python35\python3.exe D:/pyproject/day25/继承.py10爸爸

2、如果子类中的属性和父类的属性重名的话,不会覆盖父类的,而是调用哪个就是哪个值

classDad:'这个是爸爸类'money=10#Dad类的数据属性

def __init__(self,name):print("爸爸")

self.name=namedefhit_son(self):print("%s 正在打儿子" %self.name)classSon(Dad):

money= 20

pass

print(Son.money)#子类有和这个数据属性

s1=Son("gouguoqi")#实例化的时候就先从本身找到了

print(s1.name)print(s1.money)#打印实例的数据属性,自己没有就去父类找

print(Dad.money)#打印父类的数据属性

print(s1.__dict__)#查看实例的属性字典

s1.hit_son()#调用父类的函数属性

C:\python35\python3.exe D:/pyproject/day25/继承.py20爸爸

gouguoqi20

10{'name': 'gouguoqi'}

gouguoqi 正在打儿子

3、给儿子类也增加一个init函数属性和hit_son的函数属性,然后在实例化的时候就先在儿子类本身找了,找到就执行了

classDad:'这个是爸爸类'money=10#Dad类的数据属性

def __init__(self,name):print("爸爸")

self.name=namedefhit_son(self):print("%s 正在打儿子" %self.name)classSon(Dad):

money= 100000099

def __init__(self,name,age):

self.name=name

self.age=agedefhit_son(self):print("来自儿子类的hitson")

s1=Son("gouguoqi",28)#实例化的时候因为本身没有,所以会触发父类的init

s1.hit_son()

C:\python35\python3.exe D:/pyproject/day25/继承.py

来自儿子类的hitson

4、我们来看这个例子,很明显这吃喝拉撒都属于2个类的共同的地方,所以我们可以把这个做成一个父类,然后让子类都继承一下就可以了

class Cat():#定义一个猫的类,猫有叫吃喝拉撒的5个函数属性

defmiaomiaojiao(self):print("喵喵叫")defchi(self):pass

defhe(self):pass

defla(self):pass

defsa(self):pass

class Dog():#定义一个狗的类,狗有叫吃喝拉撒的5个函数属性

defwangwangjiao(self):print("汪汪叫")defchi(self):pass

defhe(self):pass

defla(self):pass

defsa(self):pass

改进之后

classAnimal():defchi(self):pass

defhe(self):pass

defla(self):print("正在拉屎")defsa(self):pass

class Cat(Animal):#继承父类Animal

defmiaomiaojiao(self):print("喵喵叫")class Dog(Animal):#继承父类Animal

defwangwangjiao(self):print("汪汪叫")print(Cat.__dict__)

Cat.la(11)

C:\python35\python3.exe D:/pyproject/day25/继承.py

{'__module__': '__main__', 'miaomiaojiao': , '__doc__': None}

正在拉屎

上面这个吃喝拉撒就是继承的父类的,miaomiaojiao和wangwangjiao就是派生,

上面这种情况尽量别用,因为从程序角度来看,子类和父类已经耦合到一起了。。。不利于后期的扩展和改动了

5、接口继承

接口继承就是(基类)父类定义好2个函数属性(接口),所有的子类必须有这2个函数属性,缺一不可,不是说省代码的,是用来做强制性约束的

基类里面的方法不用具体的实现,只是一个规范而已

5.1实现一个一切皆文件的概念

classDisk:defread(self):pass

defwrite(self):pass

classCdrom:defread(self):pass

defwrite(self):pass

classMem:defread(self):pass

defwrite(self):pass

5.2可以定义一个基类,对上面代码进行改进

classAllfile:defread(self):pass

defwrite(self):pass

classDisk(Allfile):defread(self):print("disk read")defwrite(self):print("disk write")classCdrom(Allfile):defread(self):print("cdrom read")defwrite(self):print("cdrom write")classMem(Allfile):defread(self):print("mem read")defwrite(self):print("mem write")

5.3但是子类也可以不按照你规定的出牌,Mem就是不听话,他不定义write的函数属性,然后就会从父类找。父类里面又是pass

classAllfile:defread(self):pass

defwrite(self):pass

classDisk(Allfile):defread(self):print("disk read")defwrite(self):print("disk write")classCdrom(Allfile):defread(self):print("cdrom read")defwrite(self):print("cdrom write")classMem(Allfile):defread(self):print("mem read")

m1=Mem()

m1.read()

m1.write()

C:\python35\python3.exe D:/pyproject/day25/接口继承.py

mem read

5.4所以python就有一个专门的模块来实现这个强制性的约束子类,模块叫abc

导入模块abc,给父类2个属性加上装饰器之后,如果子类再少属性的话,就直接报错了,这样就强制性的约束了子类必须有父类的2个方法了

importabcclass Allfile(metaclass=abc.ABCMeta):

@abc.abstractstaticmethoddefread(self):pass@abc.abstractstaticmethoddefwrite(self):pass

classDisk(Allfile):defread(self):print("disk read")defwrite(self):print("disk write")classCdrom(Allfile):defread(self):print("cdrom read")defwrite(self):print("cdrom write")classMem(Allfile):defread(self):print("mem read")

m1=Mem()

TypeError: Can't instantiate abstract class Mem with abstract methods write

5.5当子类Mem也加上write这个方法之后就可以正常运行了

importabcclass Allfile(metaclass=abc.ABCMeta):

@abc.abstractstaticmethoddefread(self):pass@abc.abstractstaticmethoddefwrite(self):pass

classDisk(Allfile):defread(self):print("disk read")defwrite(self):print("disk write")classCdrom(Allfile):defread(self):print("cdrom read")defwrite(self):print("cdrom write")classMem(Allfile):defread(self):print("mem read")defwrite(self):print("mem write")

m1=Mem()

m1.read()

m1.write()

C:\python35\python3.exe D:/pyproject/day25/接口继承.py

mem read

mem write

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值