面向对象的三大特性之多态,封装基础
面向对象的三大特性 : 继承 多态 封装
多态:一个类表现出多种形态:通过继承来实现的
在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
面向对象的三大特性之多态,封装基础相关推荐
- polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- 面向对象的三大特性之多态
面向对象的三大特性之多态 文章目录 面向对象的三大特性之多态 前言 一.静态多态 1.函数重载 2.函数模板 二.动态多态 1.函数重写 2.虚函数的继承特性 三.重定义 前言 多态的简单定义为同一种 ...
- 面向对象的三大特性之三:封装
面向对象之封装 阅读目录 一 引子 二 先看如何隐藏 三 封装不是单纯意义的隐藏 四 特性(property) 五 封装与扩展性 一 引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小 ...
- C++ 面向对象程序三大特性之 多态
目录 多态的概念 多态的定义及使用 虚函数 虚函数的重写 虚函数重写的两个例外 C++11中 override 和 final 重载.重写.隐藏的区别与联系 抽象类 多态的原理 虚函数指针.虚函数.虚 ...
- Python面向对象编程三大特性之多态
多态 code:_9polymorphism.py # ***************************************** """ 多态:对于同一个方法, ...
- KKB:面向对象的三大特性之一:封装
为什么要对程序进行封装? 咱们来看一个例子 程序输出 人的年龄是10000岁,显然是不合理的 为了避免这种乱赋值,数据被破坏的现象.我们需要对程序进行封装 怎么封装呢? 我们将age进行私有化,不能直 ...
- C++ 面向对象程序三大特性之 继承
目录 继承的概念 继承的定义及使用 继承方式和访问权限 基类和派生类对象的赋值转换 继承中的各成员的作用域 派生类的默认成员函数 构造函数 拷贝构造 赋值运算符重载函数 析构函数 继承与友元 继承与静 ...
- 简述一下面向对象的三大特性
问:简述一下面向对象的三大特性. 参考: 面向对象的三大特性是:封装.继承和多态. 1.封装:封装隐藏对象的属性,并且外界只能通过对外提供的接口进行访问,这个对外提供的接口一般是指get方法. 2.继 ...
最新文章
- 150页在线书「几何深度学习」上线:利用对称性和不变性解决机器学习问题
- 计数排序及其改进 C++代码实现与分析 恋上数据结构笔记
- 《Python Cookbook 3rd》笔记(3.4):二、八、十六进制整数
- 云服务器怎么管理,第一次使用云服务器,如何使用和管理云服务器
- visual studio 2008 intellisense does not work
- 会员分享几个平时看榜单常去的网站
- 关于magic-api的使用入门
- python中平方_python中平方
- js打印倒三角形和正三角形
- 关于Matlab在雷达数据处理中的一些经验分享
- 开放平台–扫描微信二维码登录
- 图神经网络模型—PATCHY-SAN的基本思想与流程
- java ftp文件大小_java如何获得ftp服务器上指定文件的大小
- 一种Δ-Σ模数转换器中梳状滤波器的设计
- Windows10下WebLogic的下载与安装
- 如何用VBA保护工作表
- 详细解析Java多态、向上转型、向下转型
- 大学生业余时间学习Python开发,20到30岁几乎决定了你的未来!
- Arista 7500E系列交换机与SFP+/QSFP+光模块搭配方案
- effective morden c++4
热门文章
- ios字典存bool_iOS 开发之字典写入文件
- zabbix 5.0所有依赖包_一杯茶的时间,上手Zabbix
- layui select第一次无法选中_Windows 10 无法访问共享的解决办法大全
- linux3.10.53编译,根据官方文档在Linux下编译安装Apache
- 扩展空间_实用!Win10开启SMB共享的方法,给GPD MicroPc扩展更多存储空间
- daocloud创建mysql_DaoCloud体验-使用node构建应用程序
- Python Tkinter教程–第1部分
- Java架构师具备的特点有哪些?
- C++教程:C++工程构建常用工具有哪些?
- canvas学习笔记-贝塞尔曲线