多态

  什么是多态?多态指的是一类事物有多种形态,例如一个动物类,狗和猫都通过继承动物类来得来,这样我们可以将狗、猫称作动物类的另一种形态。

  在java中也存在多态,java中的多态是用来解决在一个函数中如果接受2个以上类型的参数,那么这些类型都应该继承同一个类,这个类是所有子类的对象的类型,在java中函数是需要指定传入的类型的,如果传入的参数类型不对应则就会报错:

  那么java中是如何解决这个问题的呢,就是用了多态:class Payment:      #父类,支付类

pass

class Apay(Payment):  #子类,苹果支付
def pay(self):
pass class Alipay(Payment):  #子类,阿里支付
def pay(self):
pass
apay = Apay()
alipay = Alipay()
def pay(obj):  
obj.pay
pay(apay)  #传入apay类
pay(alipay)  #传入alipay类

  可以看出pay()接受了2个类型的参数,如果在java中是会报错的,那么如何解决这个问题呢。我们可以把pay()接受的参数类型定位payment类,然后所有的传入的参数都是此类的子类,这样参数类型就同一了。

  而在python中大家发现我们在传参数时并没有类型限制,这是为什么呢,大家知道python3中 全都是新式类,而新式类都自动继承了一个object一个类。所以:

在python中:函数的参数不需要指定数据类型,所以我们也不需要通过继承的形式来统一一组类的类型,
换句话说 所有的对象其实都是object类型,所以在python当中其实处处是多态。

鸭子类型:

  Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的

封装:

  什么是封装,封装就是将对象的某些属性和方法隐藏起来,只能在自己的内部调用,对外只能提供公共的访问方式。

【好处】

1. 将变化隔离;

2. 便于使用;

3. 提高复用性;

4. 提高安全性;

【封装原则】

1. 将不需要对外提供的内容都隐藏起来;

2. 把属性都隐藏,提供公共方法对其访问。

广义上的封装:

class 类名:
def 方法1(self):
pass
# 是为了只有这个类的对象才能使用定义在类中的方法

狭义的封装:

  在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

私有变量(属性)

class Goods:

    __discount = 0
print(__discount) print(Goods.__discount)  #报错提示AttributeError: type object 'Goods' has no attribute '__discount'
print(Goods.__dict__)
#运行结果:{'__module__': '__main__', '_Goods__discount': 0, '__dict__': <attribute '__dict__' of 'Goods' objects>, '__weakref__': <attribute '__weakref__' of 'Goods' objects>, '__doc__': None}

  可以看出在打印Goods属性的时候可以看到_Goods__discount': 0,而不是__discount,这是因为当定义一个--变量名时,python会将做一个变形变成_类名__变量的模式,这样对象.__变量名就找不到属性了,而在类内部__变量名还是可以找到,这也是print(__discount)运行的原因,因为在类中调用时会自定转化成_类名__变量。

总结:

1.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果

2.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。

3.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

私有方法:

  既然能将属性私有,当然也可将类的方法私有,跟私有属性一样,就是在方法前面加__:

class Goods:
__discount = 0.7
def __init__(self,name,price):
self.name = name
self.price = price
def __set_discount(self,num):
self.__discount = num

上面这个例子是一个商品类,有两个属性,一个名称还有个价格,是私用属性,外部访问不到,然后还有个私用方法,所以一般别人不知道根本修改不了折扣,也不知道商品的价格

# 类中的私有成员:
# 私有的静态属性
# 私有的对象属性
# 私有的方法 # 我为什么要定义一个私有变量呢:
# 我不想让你看到这个值
# 我不想让你修改这个值
# 我想让你在修改这个值得时候有一些限制
# 有些方法或者属性不希望被子类继承 # 私有变量能不能在外部被定义???
# class A :
# __country = 'China' # 在类的内部会发生变形
# print(__country) # '_A__country'
# print(A.__dict__)
# A.__Language = 'Chinese'
# print(A.__dict__) # 私有变量能不能被继承???
# class A:
# __country = 'China'
# def __init__(self,name):
# self.__name = name # '_A__name'
#
# class B(A):
# # print(__country)
# # NameError: name '_B__country' is not defined
# def get_name(self):
# return self.__name # '_B__name'
#
# b = B('alex')
# print(b.__dict__) # 广义上的封装 把属性函数都放到类里
# 狭义上的封装 定义私有成员 # 类中的私有成员:
# 私有的静态属性
# 私有的对象属性
# 私有的方法 # 我为什么要定义一个私有变量呢:
# 我不想让你看到这个值
# 我不想让你修改这个值
# 我想让你在修改这个值得时候有一些限制 : 保证了数据的安全
# 有些方法或者属性不希望被子类继承

python----面对对象三大特征2的更多相关文章

  1. Python - 面对对象(基础)

    目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...

  2. Python - 面对对象(进阶)

    目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...

  3. 15、python面对对象之类和对象

    前言:本文主要介绍python面对对象中的类和对象,包括类和对象的概念.类的定义.类属性.实例属性及实例方法等. 一.类和对象的概念 问题:什么是类?什么是实例对象? 类:是一类事物的抽象概念,不是真 ...

  4. Javascript基于对象三大特征 -- 冒充对象

    Javascript基于对象三大特征 基本概述 JavaScript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance ) ...

  5. Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

    目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...

  6. 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)

    小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...

  7. 小学生绞尽脑汁也学不会的python(面对对象-----成员)

    小学生绞尽脑汁也学不会的python(面对对象-----成员) 成员 class Person: def __init__(self, name, num, gender, birthday): # ...

  8. 16、python面对对象之类和继承

    前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名 ...

  9. python 面对对象基础

    目录 面向对象基础 面向对象编程(抽象) 类与对象 给对象定制独有的特征 对象的属性查找顺序 类与对象的绑定方法 类与数据类型 对象的高度整合 面向对象基础 面向对象编程(抽象) 回顾一下 面向过程编 ...

  10. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

随机推荐

  1. ImageView android:scaleType="centerCrop"

    转载地址:http://www.cnblogs.com/yejiurui/archive/2013/02/25/2931767.html 在网上查了好多资料,大致都雷同,大家都是互相抄袭的,看着很费劲 ...

  2. 一、java三大特性--封装

    封装字面意思即包装.专业点来说就是数据隐藏,是指利用抽象数据将数据和基于数据的操作封装起来,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能的隐藏细节,只保留一些对外的接口和外部 ...

  3. C#中,使用显式类型转换(int)和Math.Round方法,将浮点数转换为整数的区别

    主要区别就是,显式类型转换(int)是将浮点数的整数部分截取出来,然后转换为整数,所以相当于是向下取整.而Math.Round方法是对浮点数进行四舍五入后,转换为整数. 新建一个.NET Core控制 ...

  4. 面试2——java基础1

    1.int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象 ...

  5. Linux 磁盘与磁盘分区

    Linux 系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,硬盘对应的设备文件一般被称为块设备文件.本文介绍磁盘设备在 Linux 系统中的表示方法以及如何创建磁盘分 ...

  6. BugkuCTF 矛盾

    前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...

  7. 【URLOS开发入门】docker官方系统镜像——Alpine入门教程

    我们在进行URLOS应用开发时,经常会用到一些基础系统镜像,如:ubuntu.CentOS.Debian等,我们可以通过docker pull命令直接拉取官方镜像. root@ubuntu:~# do ...

  8. 由一个“两次请求”引出的Web服务器跨域请求访问问题的解决方案

    http://blog.csdn.net/cnhnnyzhy/article/details/53128179 (4)Access-Control-Max-Age 该字段可选,用来指定本次预检请求的有 ...

  9. 使用Zabbix服务端本地邮箱账号发送报警邮件及指定报警邮件操作记录

    邮件报警有两种情况:1)Zabbix服务端只是单纯的发送报警邮件到指定邮箱,发送报警邮件的这个邮箱账号是Zabbix服务端的本地邮箱账号(例如:root@localhost.localdomain), ...

  10. 12.24daily_scrum

    今天是平安夜,大家开心地度过一个平安夜的同时,也完成了很多软件的调试工作,我们争取在下周前完成本阶段的所有调试工作. 具体工作如下: 具体工作: 小组成员 今日任务 明日任务 工作时间 李睿琦 软件调 ...