python的类的继承-接口继承-归一化设计
1、先在子类本身找,如果子类没有,会去父类找
class Dad:
'这个是爸爸类'
money=10#Dad类的数据属性
def __init__(self,name):
print("爸爸")
self.name=name
def hit_son(self):
print("%s 正在打儿子" %self.name)
class Son(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/继承.py 10 爸爸
2、如果子类中的属性和父类的属性重名的话,不会覆盖父类的,而是调用哪个就是哪个值
class Dad:
'这个是爸爸类'
money=10#Dad类的数据属性
def __init__(self,name):
print("爸爸")
self.name=name
def hit_son(self):
print("%s 正在打儿子" %self.name)
class Son(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/继承.py 20 爸爸 gouguoqi 20 10 {'name': 'gouguoqi'} gouguoqi 正在打儿子
3、给儿子类也增加一个init函数属性和hit_son的函数属性,然后在实例化的时候就先在儿子类本身找了,找到就执行了
class Dad:
'这个是爸爸类'
money=10#Dad类的数据属性
def __init__(self,name):
print("爸爸")
self.name=name
def hit_son(self):
print("%s 正在打儿子" %self.name)
class Son(Dad):
money = 100000099
def __init__(self,name,age):
self.name=name
self.age=age
def hit_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个函数属性
def miaomiaojiao(self):
print("喵喵叫")
def chi(self):
pass
def he(self):
pass
def la(self):
pass
def sa(self):
pass
class Dog():#定义一个狗的类,狗有叫吃喝拉撒的5个函数属性
def wangwangjiao(self):
print("汪汪叫")
def chi(self):
pass
def he(self):
pass
def la(self):
pass
def sa(self):
pass
改进之后
class Animal():
def chi(self):
pass
def he(self):
pass
def la(self):
print("正在拉屎")
def sa(self):
pass
class Cat(Animal):#继承父类Animal
def miaomiaojiao(self):
print("喵喵叫")
class Dog(Animal):#继承父类Animal
def wangwangjiao(self):
print("汪汪叫")
print(Cat.__dict__)
Cat.la(11) C:\python35\python3.exe D:/pyproject/day25/继承.py {'__module__': '__main__', 'miaomiaojiao': <function Cat.miaomiaojiao at 0x0000000000702400>, '__doc__': None} 正在拉屎
上面这个吃喝拉撒就是继承的父类的,miaomiaojiao和wangwangjiao就是派生,
上面这种情况尽量别用,因为从程序角度来看,子类和父类已经耦合到一起了。。。不利于后期的扩展和改动了
5、接口继承
接口继承就是(基类)父类定义好2个函数属性(接口),所有的子类必须有这2个函数属性,缺一不可,不是说省代码的,是用来做强制性约束的
基类里面的方法不用具体的实现,只是一个规范而已
5.1实现一个一切皆文件的概念
class Disk:
def read(self):
pass
def write(self):
pass
class Cdrom:
def read(self):
pass
def write(self):
pass
class Mem:
def read(self):
pass
def write(self):
pass
5.2可以定义一个基类,对上面代码进行改进
class Allfile:
def read(self):
pass
def write(self):
pass
class Disk(Allfile):
def read(self):
print("disk read")
def write(self):
print("disk write")
class Cdrom(Allfile):
def read(self):
print("cdrom read")
def write(self):
print("cdrom write")
class Mem(Allfile):
def read(self):
print("mem read")
def write(self):
print("mem write")
5.3但是子类也可以不按照你规定的出牌,Mem就是不听话,他不定义write的函数属性,然后就会从父类找。父类里面又是pass
class Allfile:
def read(self):
pass
def write(self):
pass
class Disk(Allfile):
def read(self):
print("disk read")
def write(self):
print("disk write")
class Cdrom(Allfile):
def read(self):
print("cdrom read")
def write(self):
print("cdrom write")
class Mem(Allfile):
def read(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个方法了
import abc
class Allfile(metaclass=abc.ABCMeta):
@abc.abstractstaticmethod
def read(self):
pass
@abc.abstractstaticmethod
def write(self):
pass
class Disk(Allfile):
def read(self):
print("disk read")
def write(self):
print("disk write")
class Cdrom(Allfile):
def read(self):
print("cdrom read")
def write(self):
print("cdrom write")
class Mem(Allfile):
def read(self):
print("mem read")
m1=Mem() TypeError: Can't instantiate abstract class Mem with abstract methods write
5.5当子类Mem也加上write这个方法之后就可以正常运行了
import abc
class Allfile(metaclass=abc.ABCMeta):
@abc.abstractstaticmethod
def read(self):
pass
@abc.abstractstaticmethod
def write(self):
pass
class Disk(Allfile):
def read(self):
print("disk read")
def write(self):
print("disk write")
class Cdrom(Allfile):
def read(self):
print("cdrom read")
def write(self):
print("cdrom write")
class Mem(Allfile):
def read(self):
print("mem read")
def write(self):
print("mem write")
m1=Mem()
m1.read()
m1.write() C:\python35\python3.exe D:/pyproject/day25/接口继承.py mem read mem write
python的类的继承-接口继承-归一化设计的更多相关文章
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,在pyth ...
- python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...
- Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性
一.接口与归一化设计 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 由 ...
- python基础--接口与归一化设计、封装、异常、网络编程
1 接口与归一化设计 1.1 归一化概念: 归一化的好处: 1.归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大降低了使用者的使用难度. 2.归一化使得高层的外部 ...
- Python 3 接口与归一化设计
一.接口与归一化设计: 1.归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. 2.归一化使得高层的外部使用者可以不加区分的处理所有接口兼 ...
- python:类的基本特征------继承、多态与封装
一.继承 1,什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 cl ...
- python之接口与归一化设计
1接口 接口的概念: Java 语言中的接口很好的展现了接口的含义: IAnimal.java /* * Java的Interface很好的体现了我们前面分析的接口的特征: * 1)是一组功能的集合, ...
- 实现继承+接口继承+虚方法+隐藏方法+this/base+抽象类+密封类/方法+修饰符
概念: 在上一节课中学习了如何定义类,用类当做模板来声明我们的数据. 很多类中有相似的数据,比如在一个游戏中,有Boss类,小怪类Enemy,这些类他们有很多相同的属性,也有不同的,这个时候我们可以使 ...
- Day8 接口与归一化设计
接口:在程序的使用中,我不能把程序的主体直接提供给使用者,一般是提供一个接口. 为什么要使用接口: 1,接口提取了一群共同的函数,可以把接口当做一个函数的集合. 2,让子类去实现接口中的函数. 归一化 ...
随机推荐
- 继承类中static数据值
class A{ static int num = 1; public static void Display(){ System.out.println( num ); } } class B ex ...
- 微信小程序实现各种特效实例
写在前面 最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成,里面有一些常用的特效,总结一下,希望对大家和我都能有所帮助 实例1:滚动tab选项卡 先看一下 ...
- wireshark找不到网卡
在Capture Opinions中的interface若找不到网卡,一般是npf服务没有启动. npf是什么东东 Netgroup Packet Filter 网络数据包过滤器 NPF Device ...
- 前端项目模块化的实践2:使用 Webpack 打包基础设施代码
以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...
- mongodb分片集群
第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...
- C++基础知识(1)
C语言是结构化编程语言(for循环.while循环.do while循环和if else语句),将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起. UNIX编译和链接 UNIX用C ...
- 关于使用AzureCli登陆提示SSLError的错误解决方案
如果使用Powershell的azure cli命令登陆Azure时提示sslerror,大致如下的错误: 这个是由于你的网络前有网关造成的ssl验证没法通过. 解决方案: 在powershell中执 ...
- Hyperledger Fabric的一些密码学常识
Hash 哈希(Hash)算法主要作用是将一段任意长度的数据,经过计算转换成一段定长的数据. 这种算法的特性是:几乎不能通过Hash的结果推导出原文.并且几乎没有可能找到两个不同的信息,对两个信息进行 ...
- Java serialVersionUID作用和生成
序列化和反序列化Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(前端显然不认识Java对象),从对象到json字符串的转换, ...
- React Native 'config.h' file not found 问题、 'glog/logging.h' file not found 问题、configure: error: C compiler cannot create executables问题解决过程记录
1.在github 上面 git clone 一个RN 项目代码,npm install (yarn)后,准备运行iOS工程,发现'config.h' file not found ,恶心!!! 百度 ...