python学习day22 面向对象(四) 约束&反射
约束
约束子类内必须使用方法,不然主动异常
class BaseMessage(object):
def send(self,a1):
raise NotImplementedError('字类中必须有send方法') class Msg(BaseMessage):
def send(self):
pass class Email(BaseMessage):
def send(self):
pass class Wechat(BaseMessage):
def send(self):
pass class DingDing(BaseMessage):
def send(self):
print('钉钉') obj = Email()
obj.send()
反射
python一切皆对象,所以想要通过字符串的形式操作内部成员都可以通过反射去完成操作.
py文件 包 类 对象...
反射:根据字符串的形式去某个对象操作对象的成员.
getattr(对象名,"方法名")
- 根据字符串的形式去某个对象中获取对象的成员.
- attribute属性
class Foo(object):
def __init__(self,name):
self.name = name
def login(self):
pass
obj = Foo('alex') # 获取变量
v1 = getattr(obj,'name')
# 获取方法
method_name = getattr(obj,'login')
method_name()
setattr(对象名称,"变量",值 )
- 根据字符串的形式去某个对象中设置成员.
class Foo:
pass
obj = Foo()
obj.k1 = 999
setattr(obj,'k1',123) # obj.k1 = 123 print(obj.k1)
hasattr(对象名称,"方法名")
- 根据字符串的形式去某个对象中判断是否含有某成员.返回布尔类型
class Foo:
pass obj = Foo()
obj.k1 = 999
hasattr(obj,'k1')
print(obj.k1)
delattr(对象,"方法名")
根据字符串的形式去某个对象中删除某成员.
class Foo:
pass obj = Foo()
obj.k1 = 999
delattr(obj,'k1')
print(obj.k1)
模块importlib
importlib 用字符串的形式导入模块
模块 = importlib.import_module('utils.redis')
- 示例:
import importlib #用字符串的模式导入模块
redis = importlib.import_module("utils.redis")
#用字符串的形式去对象(模块)找到他的成员
getattr(redis,"func")()self.MIDDLEWARE_CLASSES = [
'utils.session.SessionMiddleware',
'utils.auth.AuthMiddleware',
'utils.csrf.CrsfMiddleware',
]
for mes in self.MIDDLEWARE_CLASSES:
module_path,class_name=mes.rsplit('.',maxsplit=1) #切割路径和类名
module_object = importlib.import_module(module_path) #插入模块-字符串操作
cla=getattr(module_object,class_name) #根据模块对象找到类名(字符串操作-反射)
obj = cla() #实例化对象
obj.process() #运行内部函数process
python学习day22 面向对象(四) 约束&反射的更多相关文章
- python学习之面向对象(四)
6.9 反射 反射是非常重要的内置函数之一. 反射是通过字符串去操作对象相关的属性,这里的对象包括:实列,类,当前模块,其他模块. 主要的四个函数: 查看: hasattr(对象,待查内容的字符串形式 ...
- Python学习之==>面向对象编程(二)
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
- python学习心得第四章
python 学习心得第四章 1.lambda表达式 1:什么是lambda表达式 为了简化简单函数的代码,选择使用lambda表达式 上面两个函数的表达式虽然不一样,但是本质是一样的,并且lamb ...
- Python学习笔记(四)
Python学习笔记(四) 作业讲解 编码和解码 1. 作业讲解 重复代码瘦身 # 定义地图 nav = {'省略'} # 现在所处的层 current_layer = nav # 记录你去过的地方 ...
- Python学习系列(四)(列表及其函数)
Python学习系列(四)(列表及其函数) Python学习系列(一)(基础入门) Python学习系列(二)(基础知识) Python学习系列(三)(字符串) 一.基本概念 1,列表是什么? ...
- Python学习系列(四)Python 入门语法规则2
Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...
- Python学习笔记(四)函数式编程
高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...
- python学习(十四)面向对象
Python中的面向对象,先写类,会生成类对象,类对象然后创建对象,对象就可以拿来用了. Python支持多重继承. class语句创建类对象,并将其赋值给变量名. class语句内的赋值语句会创建类 ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
随机推荐
- 携程Apollo一键编译脚本+部署实现
系统编译安装 ubuntu16.11 java 1.8 系统规划 Portal共用 其它环境每个两台机器 mysql都做主从,所以每个环境的机器上都会安装admin 服务,config服务,以及一个m ...
- CSS3制作上下跳动动画箭头效果
动画效果如下: 代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8&q ...
- 我的Spring Boot学习记录(一):自动配置的大致调用过程
1. 背景 Spring Boot通过包管理工具引入starter包就可以轻松使用,省去了配置的繁琐工作,这里简要的通过个人的理解说下Spring Boot启动过程中如何去自动加载配置. 本文中使用的 ...
- MongoDB学习(管理数据库和集合)
管理数据库 显示数据库列表 show dbs 切换到其他数据库 use <database_name> 创建数据库 MongoDB没有提供显式的创建数据库的MongoDB shell命令. ...
- 安装CentOs 7.3
步 下载安装 CentOS 7.3 下载地址 1.官网:https://www.centos.org/download/ 2.centos阿里汇总:https://yq.aliyun.com/zt/ ...
- 深入浅出KNN算法(二) sklearn KNN实践
姊妹篇: 深入浅出KNN算法(一) 原理介绍 上次介绍了KNN的基本原理,以及KNN的几个窍门,这次就来用sklearn实践一下KNN算法. 一.Skelarn KNN参数概述 要使用sklearnK ...
- eclipse下解决明明有jar包,却找不到的问题
首先右键提示缺失jar包的项目,也可能是缺失maven依赖的项目. 右键选择properties. 选择deployment assembly. 将缺少依赖的jar包,add进去.
- Linux(三)——Unix&Linux 的基础命令
Linux(三)--Unix&Linux 的基础命令 快捷键 Ctl-A 光标移动到行首 Ctl-C 终止命令 Ctl-D 注销登录 Ctl-E 光标移动到行尾 Ctl-U 删除光标到行首的所 ...
- July 12th, 2018. Thursday, Week 28th.
People love what other people are passionate about. 人总是会爱上别人倾注热情的事物. From La La Land. This quote has ...
- android申请多个权限的正确姿势
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permi ...