面向对象的接口类 以及鸭子类型
1.接口类,抽象类.
2.鸭子类型(Python多态)(Python三大特性之一)Python封装
1.接口类和抽象类只是在工作中书写的一种规范.
class QQ:
def pay(self,money):
print("使用QQ支付%s"%money)
class Ali:
def pay(self,money):
print("使用支付宝支付%s"%money)
q = QQ()
q.pay(100)
a = Ali()
a.pay(200)
上面的例子,没有统一化.不方便之后的开发
class QQ:
def pay(self,money):
print("使用QQ支付%s"%money)
class Ali:
def pay(self,money):
print("使用支付宝支付%s"%money)
def pay(self,money):
self.pay(money)
q = QQ()
a = Ali() #这样就实现了统一化
pay(q,100)
pay(a,200)
以上这版实现了统一化,但是交接的时候,新来的看不懂就会按照自己的方法写.看下面
class QQ:
def pay(self,money):
print("使用QQ支付%s"%money)
class Ali:
def pay(self,money):
print("使用支付宝支付%s"%money)
class Wechat:
def wepay(self,money):
print("使用微信支付%s"%money)
def pay(self,money):
self.pay(money)
q = QQ()
a = Ali()
pay(q,100)
pay(a,200)
w = Wechat() #新来的员工按照自己方法添加了一种,但是不规范.
w.wepay(500)
我们看一下下面的方法.
class Payment:
def pay(self):pass
class QQ(Payment):
def pay(self,money):
print("使用QQ支付%s"%money)
class Ali(Payment):
def pay(self,money):
print("使用支付宝支付%s"%money)
class Wechat(Payment):
def pay(self,money):
print("使用微信支付%s"%money)
def pay(self,money):
self.pay(money)
q = QQ()
a = Ali()
w = Wechat()
pay(q,100)
pay(a,200)
pay(w,500)
以上便是为了规避方法不统一的方法.下面的例子便是强制统一,不同一便报错.
from abc import ABCMeta , abstractmethod
class Payment(metaclass = ABCMeta):
@abstractmethod
def pay(self):pass
class QQ(Payment):
def pay(self,money):
print("使用QQ支付%s"%money)
class Ali(Payment):
def pay(self,money):
print("使用支付宝支付%s"%money)
class Wechat(Payment):
def pay(self,money):
print("使用微信支付%s"%money)
def pay(self,money):
self.pay(money)
q = QQ()
a = Ali()
w = Wechat()
pay(q,100)
pay(a,200) #强制统一化.没有统一便会报错
pay(w,500)
抽象类(接口类)用处:在工作中,如果要是规定几个类必须有一样的方法,要抽象类.制定一个规范,强制其有此方法.
Python没有多态的概念,但是Python崇尚鸭子类型.
Python中好多不同类但同名的方法不是强制规定,而是约定俗成的,像str,list,tuple这三种类,都同样具有index方法,而且功能相似,则他们三个互称为鸭子.
封装就是将一些属性或者方法(有用的信息)放置在一个空间中.
1.封装 对象的封装
class A:
def __init__(self,name,age):
self.name = name
self.age = age
p = A("alex",23)
print(p.name)
2.封装(私有成员)
类的结构分析:
class Person:
mind = "有思想" #第一部分:所有的公有静态变量,公有静态字段
__level = "高等动物" #第一步分:私有静态变量,私有静态字段
def __init__(self,name,age,sex): #构造方法,第二部分:动态方法,方法(函数)
self.name = name
self.age = age #公有对象属性
self.__sex = sex #私有对象属性
def func(self): #第二部分:普通方法
print(666)
def __func1(self): #第二部分:私有方法
print(777)
@staticmethod #静态方法
def f2():pass
@classmethod #类方法
def f2(self):pass
@property #属性
def hex(self):pass
类的整体分类:
第一部分:公有静态字段: mind = "有思想"
私有静态字段: __level = "高等动物"
第二部分:特殊方法(__init__,__str__ ....)
普通方法:def func(self)
私有方法:def __func1(self)
类方法:@classmethod
静态方法:@staticmethod
属性:@property
私有成员:私有静态字段,私有属性,私有方法.在变量前加__双下划线.
class Animal:
__cloth = "有皮毛"
class Person(Animal):
mind = "有思想"
__level = "高等动物"
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
print(self.__level) #类自己在内部访问自己的私有属性
print(self._Animal__cloth) #知道这种方法可以,但是禁止使用.
print(self.__cloth) #派生类不可访问父类的私有属性
在类的外面访问:私有静态字段是访问不到的.
p = Person("alex",100)
print(p.mind)
print(p.__level) #这样访问会报错.
print(Person.__level) #这样访问也是会报错的.
print(Person.__dict__)
print(Person._Person__level) #这个方法知道就可以了,但是禁止使用.
#可以通过 对象._类名__变量名 类名._类名__变量名 可以访问到,但是绝对不要这样做
在类的内部: 私有静态字段是可以访问的.
p.func()
父类的私有字段,派生类是否可以访问? 答案是:不可以
print(p.__cloth)
p.func() #这两种都会报错.因为在外部是不可访问父类的私有字段.
私有方法:
class Animal:
def f1(self):
print(111)
class Person(Animal):
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.__sex = sex
def __func(self):
print(6666)
def func1(self):
self.__func()
def func2(self):
self.__f1()
类外面访问不到:
p = Person("oldboy",200)
p.__func()
类的内部可以访问:
p.func1()
派生类也是访问不到的
p.func2()
私有属性也是类外部不能访问,派生类不能访问,只能类内部访问.
总结:对于私有成员来说,加载到内存时,都会加上_类名__变量名,所以在类的外部或者派生类中都不可访问.
为什么设置私有成员?
有些变量,方法,属性只在类内部进行使用即可不便于(不允许)类外部或者派生类去调用.
class A:
def __init__(self):
self.__func()
def __func(self):
print("in A")
class B(A):
def __func(self):
print("in B")
b = B()
这是一道面试题, 打印的结果是什么,为什么结果是这样的.
转载于:https://www.cnblogs.com/fengkun125/p/9255743.html
面向对象的接口类 以及鸭子类型相关推荐
- python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)
一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...
- Python面向对象之接口类(抽象类)
Python面向对象之接口类(抽象类):就是制定一个规范.比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方法 ...
- java鸭子类型_Golang中的接口与鸭子类型
1 接口的定义与理解 接口是一个自定义类型,它是一组方法的集合.从定义上来看,接口有两个特点.第一,接口本质是一种自定义类型,因此不要将golang中的接口简单理解为C++/Java中的接口,后者仅用 ...
- python鸭子类型
python鸭子类型 python不支持多态,也不用支持多态,而是一种多态的语言. 鸭子类型(duck typing):是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的 ...
- 25 类:接口 抽象父类 多态 鸭子类型 格式化方法与析构方法 反射 异常处理 自定义异常 断言...
面向对象与面向过程分析 # 清晰知道操作的功能,但不明确操作的具体对象 print(len('123')) # 清晰知道操作的对象,但不明确具体的操作方法 print('123'.__len__()) ...
- 023_接口类,抽象类,多态,鸭子类型,封装
1,接口类 1 class Wechat(): 2 def pay(self,money): 3 print('已经用微信支付了%s元'%money) 4 class Alipay(): 5 def ...
- 1023day5:class类属性方法、每次执行类属性+1、内建模块、时间装饰器wrapper、面向对象__slots__方法:限制类的属性等基础知识、正则表达式基础知识、多态鸭子类型
文章目录 一.类class 1.Python类class 属性 方法 2.类的构造方法__init__() 3.每次执行一次类的属性+1 二.模块 1.内建模块 2.第三方模块 3.定义自己的模块 三 ...
- Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)
1.创建类的代码: #在Java中,所有的最终父类都是Object #在python中也是,一个类没有直接的父类就写入objectclass Animal(object):#在python中init方 ...
- python鸭制作类代码_Python实现多态、协议和鸭子类型的代码详解
多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态. 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同 ...
最新文章
- 独家 | 一文了解强化学习的商业应用2
- ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接
- h5页面如何预览excel文件_如何让excel文件读取变得更简单
- bp神经网络训练_数据分析模型6——神经网络基础(人工智能的底层模型)
- js图片转二进制流_V8是如何执行一段JS代码的?
- Mysql数据库索引原理及算法原理
- 为 Office 2007/2010 安装程序整合 Service Pack 及更新程序
- C# 如何修改Form不能修改窗体大小
- Android数据存储——内部存储
- 请求并操作指定url处的xml文件
- node.js上传图片
- 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
- 矩阵并行加速之NENO与SSE
- C语言的s8数据结构
- 天池竞赛——工业蒸汽量预测(完整代码分享)
- html5一键打包成苹果软件,GDB苹果网页一键打包工具如何使用?GDB苹果网页一键打包工具安装使用教程...
- 不要再叫自己“程序员”了
- 挑战高薪!学习人工智能,你准备好了吗?
- 将html嵌在桌面实现动态高度可定制的动态桌面,桌面显示上显示动态网页
- macbook pro M1 外接4K显示器模糊
热门文章
- linux双ip备份,LINUX系统的双网卡双IP(双链路)实现方式
- 【HDU - 3870】Catch the Theves(平面图转对偶图最短路,网络流最小割)
- 【POJ - 1961】Period(KMP,循环节问题)
- 【HDU - 1867 】A + B for you again(KMP,next数组应用)
- 动手学PaddlePaddle(4):MNIST(手写数字识别)
- android 按钮按下缩放,android捏缩放
- zynq linux opencv效率,2 - 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结
- 计算机二级c语言第82套,计算机等级考试二级C语言模拟试题十套答案
- 在循环递增一次的数组中插入元素
- 面向对象思想精华总结