面向对象的接口类 以及鸭子类型

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql查看binlog日志内容

2019独角兽企业重金招聘Python工程师标准>>> (一) binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变,并以二进制的形式保存在磁盘中; 它可以用来查看数据库的变更历史、数据库增量备份和恢复、Mysql的复制&…

架构师:我们需要顶层设计

架构师:我们需要顶层设计背景: 某公司,建立的程序又被推倒,外人觉得很奇怪,这个程序的主管非常敬业,关注到了程序每一个细节,甚至包括每一个按钮的文字和位置。这个主管很委屈,他说…

文件传输协议FTP

文件传输协议FTP提供交互式的访问,允许客户指明文件的类型和格式,并允许文件具有存取权限。它屏蔽了个计算机系统的细节,因而适合于在异构网络中任意计算机之间传输文件。它提供不同种类主机系统之间的文件传输能力,可以提供用户对…

Centos7安装Docker教程

1.首先安装必要依赖: sudo yum install -y yum-utils device-mapper-persistent-data lvm22.然后添加仓库源: sudo sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.最后安装 Docker&#xff…

String.format() 方法用法解说

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 String chargeFlowUrl _AGENT_URL "?agentAccount" _AGENT_ACCOUNT "&sequence%s &phone%s &iceUrl%s &…

Choose unique values for the 'webAppRootKey' context-param in your web.xml files! 错误的解决

大意是Log4jConfigListener在获取webapp.root值时&#xff0c;被后一context的值替换掉了&#xff0c;所以要在各个项目的web.xml中配置不同的webAppRootKey值&#xff0c;随即在其中一个web.xml中添加&#xff1a; <context-param> <param-name>webAppRootKey<…

ionic3 cordova ionic-native插件

ionic-native插件 cordova安装插件 以及 ionic-native插件使用过程以及步骤 cordova plugin add cordova-plugin-插件名称。 //安装插件npm install ionic-native/对应插件名称 --save。 //写入package.json在app.module.ts 的 providers 进行引用解释&#xff1a;cordove plug…

Diango博客--19.使用 Docker部署项目到线上服务器

文章目录1.克隆代码到服务器2.创建环境变量文件用于存放项目敏感信息3.在 .production 文件写入下面的内容并保存4.修改 Nginx 配置5.修改项目配置文件6.启动容器7.检查容器启动状况8.配置 HTTPS 证书&#xff08;没有配置域名无法配置&#xff0c;只能通过服务器 ip 以 HTTP 协…

从一生的角度看程序员的学习和发展

很多人谈学习和发展的时候&#xff0c;往往忽略人的先天自然条件&#xff0c;在这里我们从这个视角切入&#xff0c;来探讨一下程序员一生的可能轨迹。 如果把程序员的人生分为三个阶段&#xff0c;那么他们是&#xff1a; 毕业~30岁&#xff1a;这个时间段里&#xff0c;大多…

Jquery Datatable 数据填充报错:requested unknown parameter ‘XXX‘ for row xx, column xx 解决方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如图&#xff1a; 解决方法见官网&#xff1a;https://datatables.net/manual/tech-notes/4 摘要如下&#xff1a; Parameter is an…

Tarjan-缩点

$Tarjan$缩点 Tarjan的第二个应用就是求缩点啦。缩点虽然比割点麻烦一点&#xff0c;但是用处也比割点要大不少。 本来要学另外两个缩点算法的,但是似乎没什么用...$MST$里确实有只能有$prim$或者只能用$kruscal$的题目&#xff0c;但是这三种缩点...在网上没有找到介绍它们之间…

mysqldump参数详细说明(转)

Mysqldump参数大全&#xff08;参数来源于mysql5.5.19源码&#xff09; 参数 参数说明 --all-databases , -A 导出全部数据库。 mysqldump -uroot -p --all-databases --all-tablespaces , -Y 导出全部表空间。 mysqldump -uroot -p --all-databases --all-tablespaces --n…

Diango博客--20.开启 Django 博客的 RSS 功能

1.Rss简介 博客提供 RSS 订阅应该是标配&#xff0c;这样读者就可以通过一些聚合阅读工具订阅你的博客&#xff0c;时时查看是否有文章更新&#xff0c;而不必每次都跳转到博客上来查看。现在我们就来为博客添加 RSS 订阅功能。 RSS&#xff08;Really Simple Syndication&am…

什么是P2P

P2P技术又称为点对点传输技术。举个简单的例子&#xff0c;以便可以更好的理解。比如&#xff0c;以前我们要下载一个文件&#xff0c;我们一定要从服务器下载。有了P2P技术之后&#xff0c;我们可以向其它下载过这个文件的电脑获取这个文件&#xff0c;我下载完成了这个文件之…

SQL语句使用大全,最常用的sql语句

下列语句部分是Mssql语句&#xff0c;不可以在access中使用. SQL分类&#xff1a; DDL—数据定义语言(Create&#xff0c;Alter&#xff0c;Drop&#xff0c;DECLARE) DML—数据操纵语言(Select&#xff0c;Delete&#xff0c;Update&#xff0c;Insert) DCL—数据控制语言(…

Oracle 的 SQL语句中 decode()函数

decode()函数简介&#xff1a; 主要作用&#xff1a;将查询结果翻译成其他值&#xff08;即以其他形式表现出来&#xff0c;以下举例说明&#xff09;&#xff1b; 使用方法&#xff1a; Select decode&#xff08;columnname&#xff0c;值1,翻译值1,值2,翻译值2,...值n,翻译值…

百度王一男: DevOps 的前提是拆掉业务-开发-测试-运维中间的三面墙

这是一个创建于 375 天前的主题&#xff0c;其中的信息可能已经有所发展或是发生改变。由数人云、优维科技、中生代社区联合发起的 系列 Meetup 《 DevOps&SRE 超越传统运维之道》 先后在深圳、北京举行过两场 7 月 15 日上海站&#xff0c;敬请期待 ▼ 王一男老师在《 Dev…

linux上mongodb的安装与卸载

安装 1.下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下载完成后解压缩压缩包 tar zxf mongodb-linux-i686-1.8.2.tgz 2. 安装准备 将mongodb移动到/usr/local/server/mongdb文件夹 mv mongodb-linux-i686-1.8.2 /usr/local/mongodb 创建数据…

面向对象设计的准则

1.模块化 对象就是模块 把数据结构和操作这些数据的方法紧密地结合在一起 2.抽象 过程抽象 数据抽象&#xff1a;类 参数化抽象&#xff1a;C的“模板” 3.信息隐藏 通过对象的封装性实现类&#xff0c;分离了接口与实现&#xff0c;支持信息隐藏 4.弱耦合 某一部分的…

Linux触发连锁反应,惠及全球

所谓“连锁反应”是指&#xff0c;若干个相关的事物&#xff0c;只要一个发生变化&#xff0c;其他都跟着发生变化。在软件界的“圈子”里面&#xff0c;一般而言&#xff0c;“连锁反应”这个词汇是不经常使用的。 4月21日&#xff0c;芬兰科学院把2012年最高技术成就奖授予Li…