023_接口类,抽象类,多态,鸭子类型,封装
1 class Wechat(): 2 def pay(self,money): 3 print('已经用微信支付了%s元'%money) 4 class Alipay(): 5 def pay(self,money): 6 print('已经用支付宝支付了%s元' % money) 7 wechat = Wechat() 8 ali = Alipay() 9 # wechat.pay(100) 10 # ali.pay(200) 11 #将上面两句用下面的替换, 12 def pay(pay_obj,money): # 统一支付入口 13 pay_obj.pay(money) 14 pay(wechat,100) 15 psy(ali,200)
2,规范化程序
如果来个人接手这个程序,他要添加一个应用支付。但他并不知道你的其它应用支付方法你定义的都是pay方法(程序如上例),且统一支付接口调用pay方法。
他自己添加的应用支付的支付方法并不是用pay命名的。因此,当用统一接口支付时,找不到对应的支付方法,就会报错。
class Applepay():def zhifu(self,money):print('已经用applepay支付了%s元' % money)
app = Applepay()
pay(app,100) #报错
定义一个父类,并将上面的支付程序都继承这个父类,当用统一接口调用时,如该应用的支付没有该方法,就会执行父类的这个pay方法,抛出异常给接受该程序的人看,告诉他,没有实现这个方法。
class Payment:def pay(self,money):raise NotImplemented #抛出没有实现这个方法的异常
2.3,解决方法升级,规范化程序
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta): # 元类 默认的元类 type #metaclass不是继承,而是指定元类@abstractmethoddef pay(self,money):pass # 没有实现这个方法
这样接手的人在实例化对象时,就会报错,并提示少了什么方法。
app = Applepay() #报错
# python中规范化程序称为 :接口类或者抽象类都可以
#在Java中有严格区分:
# 接口类 支持多继承,接口类中的所有的方法都必须不能实现 —— java
# 抽象类 不支持多继承,抽象类中方法可以有一些代码的实现 —— java
抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计
在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。
python没有多态,因为python天生支持多态
多态指的是一类事物有多种形态,动物有多种形态:人,狗,猪
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物@abc.abstractmethoddef talk(self):pass
class People(Animal): #动物的形态之一:人def talk(self):print('say hello')
class Dog(Animal): #动物的形态之二:狗def talk(self):print('say wangwang')
class Pig(Animal): #动物的形态之三:猪def talk(self):print('say aoao')
逗比时刻:
- Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’ 。
- python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象,也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
- 例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法
- 例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系
class TxtFile:def read(self):passdef write(self):pass
class DiskFile:def read(self):passdef write(self):pass
# 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
# 只让自己的对象能调用自己类中的方法
# 属性 和 方法都藏起来 不让你看见
# 对象的私有属性
# 类中的私有方法
# 类中的静态私有属性
# 所有的私有的 都不能在类的外部使用
class Person:__key = 123 # 私有静态属性def __init__(self,name,passwd):self.name = nameself.__passwd = passwd # 在变量的左边加上双下划线,就变成私有属性 #变形为:_Person__passwddef __get_pwd(self): # 私有方法 #变形为:_Person__get_pedreturn self.__passwd #只要在类的内部使用私有属性,就会自动的带上“_类名”,在外部这样定义不会。def login(self): # 正常的方法调用私有的方法,即在只在内部使用self.__get_pwd()
alex = Person('alex','alex3714')
print(alex._Person__passwd) # “_类名或对象名__属性名”可以调出该属性,但是不要用此方法在外部操作。
print(alex.get_pwd())
6.2,可以设置,get和set方法以便在外部更改查看私有属性,可能会想为什么要多此一举,不设成私有的不久行了吗。
这样写有它的好处,即可以在get和set方法中加限定条件,以满足要求。所以,如果不需要对外限定保护属性,可以不用设定成私有的。
class Room:def __init__(self,name,length,width):self.__name = nameself.__length = lengthself.__width = widthdef get_name(self): #不加限定条件的getreturn self.__namedef set_name(self,newName): #加限定条件的setif type(newName) is str and newName.isdigit() == False:self.__name = newNameelse:print('不合法的姓名')def area(self):return self.__length * self.__widthjin = Room('金老板',2,1)
print(jin.area())
jin.set_name('2')
print(jin.get_name())
6.3,假设父类的私有属性 能被子类调用么?,不会
class Foo:__key = '123' #变形为: _Foo__keyclass Son(Foo):print(Foo.__key) #继承属性后变形为: _Son__key
6.4,会用到私有的这个概念de场景
1.隐藏起一个属性 不想让类的外部调用
2.我想保护这个属性,不想让属性随意被改变
3.我想保护这个属性,不被子类继承
转载于:https://www.cnblogs.com/eternity-twinkle/p/10605583.html
023_接口类,抽象类,多态,鸭子类型,封装相关推荐
- 25 类:接口 抽象父类 多态 鸭子类型 格式化方法与析构方法 反射 异常处理 自定义异常 断言...
面向对象与面向过程分析 # 清晰知道操作的功能,但不明确操作的具体对象 print(len('123')) # 清晰知道操作的对象,但不明确具体的操作方法 print('123'.__len__()) ...
- 接口类抽象类 封装
接口类抽象类: 第一版,不好,没有统一化设计,第二版解决. class QQ:def pay(self,money):print('您用qq支付了%s元' % money)class Ali:de ...
- python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)
一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...
- 1023day5:class类属性方法、每次执行类属性+1、内建模块、时间装饰器wrapper、面向对象__slots__方法:限制类的属性等基础知识、正则表达式基础知识、多态鸭子类型
文章目录 一.类class 1.Python类class 属性 方法 2.类的构造方法__init__() 3.每次执行一次类的属性+1 二.模块 1.内建模块 2.第三方模块 3.定义自己的模块 三 ...
- Python3中的多态 ,鸭子类型
多态的概念 : -一个对象具有多种形态 , 在不同的使用环境中以不同的形态展示其功能 , 称该对象具有多态特征 鸭子类型 : -鸭子类型是一种特殊的调用现象 , 当对象在语法层面能够满足调用关系 , ...
- 面向对象的接口类 以及鸭子类型
1.接口类,抽象类. 2.鸭子类型(Python多态)(Python三大特性之一)Python封装 1.接口类和抽象类只是在工作中书写的一种规范. class QQ: def pay(self,mo ...
- python 接口(抽象) 多态,鸭子类型, 多继承原理(mro)
抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...
- Python学习日记(二十五) 接口类、抽象类、多态
接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...
- php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别
/** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候 ...
最新文章
- mmdetection2.3.0版本安装过程,以及训练、测试、可视化等(亲测好用,很顺利)
- mysql float 精度阶段_mysql下float类型使用一些误差详解
- Hadoop服务器集群安装部署及配置
- [python作业AI毕业设计博客]大数据Hadoop工具python教程1-HDFS Hadoop分布式文件系统...
- 在Java中键入Safe SQL
- MPI多机器实现并行计算
- 为Mac安装homebrew
- PHP有表单和js交互乱码问题,js 和 php交互问题
- html自动生成工具_「写论文神器」一个好用的论文自动生成工具,内含30w 文献数据...
- 矩阵理论——正交变换
- android车载导航测试,嘟嘟车心安卓车载导航开箱体验
- Python 数据分析微专业课程--项目实战09 房价影响因素挖掘1.项目说明2.项目具体要求3.实现思路:4.实现过程:5.结论:
- 涨跌的例题用C语言编辑,涨跌比率指标用法及源代码(ADR)
- 计算机英语 单词1-100
- c语言,函数声明的误区
- RMAN下CROSSCHECK命令详解
- opensips 配置文件
- 吉林大学考研计算机科学与技术,2022年吉林大学计算机科学与技术学院考研初试科目调整通知...
- 艺术家与AI研究者的跨界碰撞丨记青源Workshop「AI+艺术」研讨会(2022年第10期)...
- java自动输入验证码_【自动化测试】使用Java+selenium填写验证码成功登录