python_14 多态,封装
多态:
由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同。
多态的概念指出了对象如何通过他们的共同的属性和动作来操作及访问,而不需考虑他们的类。
class H2O:
def __init__(self,name,temperature):
self.temperature=temperature
self.name=name def turn(self):
if self.temperature<0:
print('%s 冰'%self.name)
elif self.temperature>100:
print('%s 水蒸气'%self.name)
else:print('%s 水'%self.name) class Water(H2O):
pass class Ice(H2O):
pass class Vapor(H2O):
pass w1=Water('水',25)
i1=Ice('冰',-25)
v1=Vapor('水蒸气',200) def func(obj):
obj.turn() func(w1)
func(i1)
func(v1)
多态实际上依附于继承,多态实际上是继承的实现细节
封装
第一个层面的封装:类本身
第二个层面的封装:类中定义私有的,外部无法访问,python约定,类中单下划线开头的变量和函数外部不可访问,双下划线开头的变量或函数python会重命名,变成_类名__变量名访问
第三个层面的封装:明确区分内外,内部实现逻辑,外部无法知晓,并且为内部封装的逻辑提供一个接口给外部使用。定义接口函数,内部调用私有属性,外部调用接口函数。
面向对象的优点:
面向对象是一种高等级的结构化编程方式
1.通过封装明确内外,内部逻辑外部无需知道,想让你知道的你才能知道
2.通过继承+多态在语言层面支持归一化设计
反射/自省
参考:反射
下列方法使用于类和对象
hasattr(obj,name)判断object中有没有一个name字符串对应的方法或属性
getattr(obj,name,default=None)返回object中name字符串对应的方法或属性,相当于x.'y',没有则报错,可返回defalut设置值
setattr(x,y,v)在object中设置或修改一个方法或属性
delattr(x,y)在object中删除一个方法或属性
class House:
owner='April'
def __init__(self,name,money):
self.name=name
self.money=money def decorate(self):
print('装修花了',self.money) h1=House('Manuel',1000000) print(hasattr(h1,'decorate'))
print(hasattr(h1,'owner')) a=getattr(h1,'owner')
print(a)
b=getattr(h1,'eee','没有这个属性')
print(b) setattr(h1,'style','北欧')
print(h1.__dict__)
c=h1.style
print(c) setattr(h1,'owner','Manuel')
print(h1.owner) print('~~~~~~~~~~~~~')
delattr(h1,'owner')
print(h1.__dict__)
反射/自省的作用:
不影响前人编写代码的情况下,写自己的逻辑
动态导入模块:
若导入模块为字符串,利用__import__('a.b.c')方法,调用的是最顶级的模块,如需导入c模块中的c1函数,
i=__import__('a.b.c')
i.b.c.c1()
或:
与上述方法的区别是直接导入了a.b.c模块
import importlib
m=importlib.import_module('a.b.c')
1
python_14 多态,封装的更多相关文章
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
- 组合&多态&封装
目录 组合&多态&封装 一.组合 1.1什么是组合 1.2 为什么要用组合 1.3 如何使用组合 1.4 继承和组合都在什么时候用 二.多态与多态性 2.1 什么是多态 2.2 如何用 ...
- 继承 & 多态 & 封装
什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class Par ...
- python面向对象 : 抽象类(接口类),多态,封装(私有制封装)
一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...
- day25类的组合多态封装
类的组合多态与封装类的组合 1. 什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 2. 为何要用组合 通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以 ...
- 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装
抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...
- python oop常用术语 继承 多态 封装
面向对象优点 1.通过封装明确了内外 2.通过继承+多态在语言层面支持了归一化设计 抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现 ...
- python day - 19 抽象类 接口类 多态 封装
一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...
- 从零开始—Socket系统调用和多态封装
1 重新搭建实验环境 前面都是用实验楼环境做的实验,偷的懒总是要还的,这一次重装环境前后花了十几个小时,踩了无数的坑. 1.1 Ubuntu和LINUX内核的区别 Ubuntu是基于LINUX内核编写 ...
随机推荐
- 常用的HTML模板(转载)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js/php判断移动端还是PC端
if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobi ...
- Java泛型相关总结(上)
最近在看<Java核心技术>泛型相关的部分,总结下. 泛型程序设计是什么? 泛型编程(generic programming)是计算机编程中的一种风格,类型通过参数指定.意味着编写的代码可 ...
- eclipse项目改为maven项目导致svn无法比较历史数据的解决办法
这个问题没有找到合适的答案,最终自己想出了一个解决方案,在此记录下. 问题描述 在将老的eclipse项目重构为maven项目时,我这边是新建了一个maven项目,然后将对应的数据分别放到相应的位置, ...
- k8s基于CA签名的双向数字证书认证(三)
1.设置kube-apiserver的CA证书相关的文件和启动参数 1)创建CA证书和私钥相关的文件 openssl genrsa -out ca.key openssl req -x509 -n ...
- 剑指offer 13.代码的完整性 调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 本渣渣解题思路: ...
- httpd2.4.6配置文件解释说明
本文httpd版本为:2.4.6 ServerRoot 先来看一下httpd.conf配置文件中的ServerRoot默认定义: # cat /etc/httpd/conf/httpd.conf |e ...
- css格式
<head> <style>body {color:#000000;font-weight:normal;} .c1{ color: #fff; background-colo ...
- SQL触发器批量删除数据库中的表
以下通过触发器批量删除数据库中的表,SQL2008已验证 DECLARE @Table NVARCHAR() DECLARE @Count Int = DECLARE tmpCur CURSOR FO ...
- centos7卸载旧jdk安装新jdk1.8
卸载旧JDK版本 需卸载centos7自带的JDK1.7 rpm -qa|grep jdk 列出已安装jdk版本 rpm -e --nodeps java-1.7.0-openjdk-1.7. ...