面向对象的三大特性  :  继承    多态    封装

  多态:一个类表现出多种形态:通过继承来实现的

在python中:由于函数的参数不需要指定数据类型,所以也不需要通过继承的形式来统一一组类的类型

  换句话说,所有的对象都有有一个共同的父类(object),即类型都可以是object类型,所以python中处处是多态。

在Java中:在一个函数中需要给参数指定数据类型,如果这个地方可以接受俩个以上的类型的参数,那么这些类型都应该定义一个共同的父类,这个父类是所以子类对象的类型。

    就是运用多态来解决传参数的时候,数据类型的规范问题。

  鸭子类型:指如果看起来像,叫声像鸭子,那么它就是鸭子

    不是明确的通过继承实现的多态。而是通过一个模糊的概念来 判断这个函数能不能接受这个类型的参数。

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

封装:

  封装的好处:将变化隔离;便于使用;提高复用性;提高安全性

  封装的原则:将不需要对外提供的内容都隐藏起来,把属性隐藏,提供公共方法对其访问

  广义上的封装:就是把属性函数(打包)都放在类里,方便类的对象进行调用

  就是只有这个类实例化的对象才能使用类中的方法

  狭义上的封装:就是私有的

class Goods:__discout = 0   #在类中定义私有的   就是 __变量名    这样的格式print(__discout)    #直接打印  0
# print(Goods.__discount)     #报错。说明在类的外部不能直接引用私有的静态变量
print(Goods.__dict__)       #可以通过查看类中的所有属性和方法   找到'_Goods__discout': 0,
print(Goods._Goods__discout)    #打印  出  0  从编程规范的角度上来说,我们不能再类的外部使用                         私有的变量

    类中的静态变量和方法名在程序的加载过程中就已经执行完了,而不是在调用的时候才加载

    当类中所有的属性加载完之后,才在内存中显示出这个类的名字。

    私有的静态属性可以在类的内部直接使用,它的作用就是为了隐藏某个变量的值

class Student:def __init__(self,name,age):self.__name = nameself.age = agedef name(self):     #可以通过方法来查看私有的属性return self.__name
l1 = Student("alex",18)
print(l1.name())        #通过调用方法来显示私有变量的内容

class Goods:__discount = 0.7def __init__(self,name,price):self.name = nameself.__price = price@property       #property 是一个装饰器函数  调用的这个方法的时候就可以不再方法后面加()  自我理解def price(self):return self.__price * self.__discountdef change_price(self,new_price):if type(new_price) is int:self.__price = new_price        #私有的变量只能在内部通过方法来进行修改else:print("本次价格修改不成功")
a1 = Goods("苹果",5)
print(a1.price)    #3.5   #通过装饰器后,这里就可以不加括号
a1.change_price(8)  #调用方法修改私有的变量
print(a1.price)     #5.6

类中的私有成员:

  私有的静态属性  (__name = "alex")

  私有的对象属性  (self.__name = name)

  私有的方法  (父类不想让子类覆盖自己的方法,可以将方法定义为私有的)

class User:__nationality = "China"     #私有静态属性def __init__(self,name,pwd):self.name = nameself.__pwd = pwd        #私有的对象属性self.pwd = self.__getpwd()def __getpwd(self):         #私有的方法return hash(self.__pwd)@propertydef nationality(self):return User.__nationality
obj = User("alex","alex123")
print(obj.nationality,obj.name,obj.pwd)     #China alex -1388251584925158483

我为什么要定义一个私有变量?:

  我不想让你看到这个值

  我不想让你修改这个值

  我想让你在修改这个值的时候有一些限制

  有些方法或者属性不希望被子类继承

私有变量不能再外部被定义:

  例:

class A:__county = "China"  #在类的内部会发生变形    变成了_A__countyprint(__county)
A.__Language = "Chinese"    #这个只是在类中增加了一个静态属性
print(A.__dict__)
print(A.__Language)

私有变量不能被继承(可以使用(按照规范又不能这样做))

  

class A:__county = "China"def __init__(self,name):self.__name = name
class B(A):# print(__county)     #报错NameError: name '_B__county' is not definedprint(A._A__county)     #就是通过类名去调用的def get_name(self):return self.__name
b = B("alex")
print(b._A__county)     #China
print(b.__dict__)   #{'_A__name': 'alex'}

转载于:https://www.cnblogs.com/yuncong/p/9556418.html

面向对象的三大特性之多态,封装基础相关推荐

  1. polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  2. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  3. 面向对象的三大特性之多态

    面向对象的三大特性之多态 文章目录 面向对象的三大特性之多态 前言 一.静态多态 1.函数重载 2.函数模板 二.动态多态 1.函数重写 2.虚函数的继承特性 三.重定义 前言 多态的简单定义为同一种 ...

  4. 面向对象的三大特性之三:封装

    面向对象之封装 阅读目录 一 引子 二 先看如何隐藏 三 封装不是单纯意义的隐藏 四 特性(property) 五 封装与扩展性 一 引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小 ...

  5. C++ 面向对象程序三大特性之 多态

    目录 多态的概念 多态的定义及使用 虚函数 虚函数的重写 虚函数重写的两个例外 C++11中 override 和 final 重载.重写.隐藏的区别与联系 抽象类 多态的原理 虚函数指针.虚函数.虚 ...

  6. Python面向对象编程三大特性之多态

    多态 code:_9polymorphism.py # ***************************************** """ 多态:对于同一个方法, ...

  7. KKB:面向对象的三大特性之一:封装

    为什么要对程序进行封装? 咱们来看一个例子 程序输出 人的年龄是10000岁,显然是不合理的 为了避免这种乱赋值,数据被破坏的现象.我们需要对程序进行封装 怎么封装呢? 我们将age进行私有化,不能直 ...

  8. C++ 面向对象程序三大特性之 继承

    目录 继承的概念 继承的定义及使用 继承方式和访问权限 基类和派生类对象的赋值转换 继承中的各成员的作用域 派生类的默认成员函数 构造函数 拷贝构造 赋值运算符重载函数 析构函数 继承与友元 继承与静 ...

  9. 简述一下面向对象的三大特性

    问:简述一下面向对象的三大特性. 参考: 面向对象的三大特性是:封装.继承和多态. 1.封装:封装隐藏对象的属性,并且外界只能通过对外提供的接口进行访问,这个对外提供的接口一般是指get方法. 2.继 ...

最新文章

  1. 150页在线书「几何深度学习」上线:利用对称性和不变性解决机器学习问题
  2. 计数排序及其改进 C++代码实现与分析 恋上数据结构笔记
  3. 《Python Cookbook 3rd》笔记(3.4):二、八、十六进制整数
  4. 云服务器怎么管理,第一次使用云服务器,如何使用和管理云服务器
  5. visual studio 2008 intellisense does not work
  6. 会员分享几个平时看榜单常去的网站
  7. 关于magic-api的使用入门
  8. python中平方_python中平方
  9. js打印倒三角形和正三角形
  10. 关于Matlab在雷达数据处理中的一些经验分享
  11. 开放平台–扫描微信二维码登录
  12. 图神经网络模型—PATCHY-SAN的基本思想与流程
  13. java ftp文件大小_java如何获得ftp服务器上指定文件的大小
  14. 一种Δ-Σ模数转换器中梳状滤波器的设计
  15. Windows10下WebLogic的下载与安装
  16. 如何用VBA保护工作表
  17. 详细解析Java多态、向上转型、向下转型
  18. 大学生业余时间学习Python开发,20到30岁几乎决定了你的未来!
  19. Arista 7500E系列交换机与SFP+/QSFP+光模块搭配方案
  20. effective morden c++4

热门文章

  1. ios字典存bool_iOS 开发之字典写入文件
  2. zabbix 5.0所有依赖包_一杯茶的时间,上手Zabbix
  3. layui select第一次无法选中_Windows 10 无法访问共享的解决办法大全
  4. linux3.10.53编译,根据官方文档在Linux下编译安装Apache
  5. 扩展空间_实用!Win10开启SMB共享的方法,给GPD MicroPc扩展更多存储空间
  6. daocloud创建mysql_DaoCloud体验-使用node构建应用程序
  7. Python Tkinter教程–第1部分
  8. Java架构师具备的特点有哪些?
  9. C++教程:C++工程构建常用工具有哪些?
  10. canvas学习笔记-贝塞尔曲线