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

面向对象的接口类 以及鸭子类型相关推荐

  1. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  2. Python面向对象之接口类(抽象类)

    Python面向对象之接口类(抽象类):就是制定一个规范.比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方法 ...

  3. java鸭子类型_Golang中的接口与鸭子类型

    1 接口的定义与理解 接口是一个自定义类型,它是一组方法的集合.从定义上来看,接口有两个特点.第一,接口本质是一种自定义类型,因此不要将golang中的接口简单理解为C++/Java中的接口,后者仅用 ...

  4. python鸭子类型

    python鸭子类型 python不支持多态,也不用支持多态,而是一种多态的语言. 鸭子类型(duck typing):是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的 ...

  5. 25 类:接口 抽象父类 多态 鸭子类型 格式化方法与析构方法 反射 异常处理 自定义异常 断言...

    面向对象与面向过程分析 # 清晰知道操作的功能,但不明确操作的具体对象 print(len('123')) # 清晰知道操作的对象,但不明确具体的操作方法 print('123'.__len__()) ...

  6. 023_接口类,抽象类,多态,鸭子类型,封装

    1,接口类 1 class Wechat(): 2 def pay(self,money): 3 print('已经用微信支付了%s元'%money) 4 class Alipay(): 5 def ...

  7. 1023day5:class类属性方法、每次执行类属性+1、内建模块、时间装饰器wrapper、面向对象__slots__方法:限制类的属性等基础知识、正则表达式基础知识、多态鸭子类型

    文章目录 一.类class 1.Python类class 属性 方法 2.类的构造方法__init__() 3.每次执行一次类的属性+1 二.模块 1.内建模块 2.第三方模块 3.定义自己的模块 三 ...

  8. Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)

    1.创建类的代码: #在Java中,所有的最终父类都是Object #在python中也是,一个类没有直接的父类就写入objectclass Animal(object):#在python中init方 ...

  9. python鸭制作类代码_Python实现多态、协议和鸭子类型的代码详解

    多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态. 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同 ...

最新文章

  1. 独家 | 一文了解强化学习的商业应用2
  2. ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接
  3. h5页面如何预览excel文件_如何让excel文件读取变得更简单
  4. bp神经网络训练_数据分析模型6——神经网络基础(人工智能的底层模型)
  5. js图片转二进制流_V8是如何执行一段JS代码的?
  6. Mysql数据库索引原理及算法原理
  7. 为 Office 2007/2010 安装程序整合 Service Pack 及更新程序
  8. C# 如何修改Form不能修改窗体大小
  9. Android数据存储——内部存储
  10. 请求并操作指定url处的xml文件
  11. node.js上传图片
  12. 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
  13. 矩阵并行加速之NENO与SSE
  14. C语言的s8数据结构
  15. 天池竞赛——工业蒸汽量预测(完整代码分享)
  16. html5一键打包成苹果软件,GDB苹果网页一键打包工具如何使用?GDB苹果网页一键打包工具安装使用教程...
  17. 不要再叫自己“程序员”了
  18. 挑战高薪!学习人工智能,你准备好了吗?
  19. 将html嵌在桌面实现动态高度可定制的动态桌面,桌面显示上显示动态网页
  20. macbook pro M1 外接4K显示器模糊

热门文章

  1. linux双ip备份,LINUX系统的双网卡双IP(双链路)实现方式
  2. 【HDU - 3870】Catch the Theves(平面图转对偶图最短路,网络流最小割)
  3. 【POJ - 1961】Period(KMP,循环节问题)
  4. 【HDU - 1867 】A + B for you again(KMP,next数组应用)
  5. 动手学PaddlePaddle(4):MNIST(手写数字识别)
  6. android 按钮按下缩放,android捏缩放
  7. zynq linux opencv效率,2 - 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结
  8. 计算机二级c语言第82套,计算机等级考试二级C语言模拟试题十套答案
  9. 在循环递增一次的数组中插入元素
  10. 面向对象思想精华总结