Python【day 19】反射
''''''
'''
一、昨日内容回顾
1、依赖关系
1、弱关系、多态
1、松耦合
2、大象可以装冰箱,也可以装高压锅,就是多态 2、例子:
1、大象装冰箱
2、大象装高压锅
3、你打车 3、写法
大象类中的普通方法的参数是冰箱对象
大象类中的普通方法体是冰箱对象.冰箱的普通方法 2、关联关系
1、一对一
1、强关系
2、例子
1、男女朋友 3、写法
1、男孩类的普通方法的参数是女孩对象
2、男孩类的普通方法体是
self.girl_friend = girl
#用self.girl_friend指代女孩对象 2、一对多
1、强关系
2、例子
1、学校和老师
3、写法
1、学校类的构造方法中,定义老师列表-空列表(可以定义私有变量)
2、学校类的普通方法中-招聘(参数是老师对象)
老师列表中追加老师对象
3、学校类的普通方法-展示
循环遍历老师的姓名 3、一对一和一对多的区别
一、写法不同
1、前者
男孩类的成员方法
def meet(self,girl): #参数是女孩对象 女孩对象传递给男孩的女朋友这个成员变量
self.girl_friend = girl #关键点
#男孩对象的成员变量-girl_friend就是女孩对象 2、后者
学校类的构造方法
self.__techer_list = []
学校类的成员方法
def recruit(self,t): #招聘-成员方法 参数t是老师对象
self.__techer_list.append(t) 二、例子不同
1、前者的例子是男女朋友
2、后者的例子是学校和老师 3、特殊成员
1、 __init__()
#新建对象的时候,自动调构造方法 2、 __str__()
1、打印对象的时候,默认打印对象的内存地址
2、如果在__str__()方法中,返回自定义的字符串,那么
打印对象的时候,就不是内存地址,而是自定义的字符串
3、注意点:
__str__() 方法的返回值的类型必须是字符串,而不能是元组,否则会报错 3、 __new__()
创建对象的过程
1、加载类 2、开辟内存空间
通过__new__(cls)方法 3、创建对象
通过__new__(cls)方法的返回值
return object.__new__(cls)来创建对象
注意点:__new__()的参数是cls类,而不是对象
(因为现在对象还没有创建出来) 4、初始化对象
创建对象的时候,自动调构造方法
把成员变量封装到对象中 5、使用对象
对象调成员方法、调成员变量 4、 __call__()
对象名后面加上小括号,就是调了__call__()方法 5、 __enter__()
6、 __exit__()
__enter__()方法
return var1
__exit__()方法
with 对象 as 变量:
print var1 #这里的var1是__enter__方法的返回值
1、说明:
with的执行过程
1、先执行__enter__方法
2、再执行with中的代码块
3、最后执行__exit__方法 7、 __setitem__()
8、 __delitem__()
9、 __getitem__()
def __getitem__(self, item):
print('我是__getitem__方法',item) def __setitem__(self, key, value):
print('我是__setitem__方法',key,value) def __delitem__(self, key):
print('我是__delitem__方法',key) f1['name'] #我是__getitem__方法 name
#这里调用的是__getitem__()方法 f1['name'] = 'jack' #我是__setitem__方法 name jack
#这里调用的是__setitem__()方法 del f1['name'] #我是__delitem__方法 name
#这里调用的是__delitem__()方法 10、 __hash__()
1、类和对象都是可哈希的-不可变的,可以作为字典的key
因为类都是object的子类,object类中有__hash__()方法
2、 __hash__ = None
在类中加入上面一行,就是重写了其父类object的__hash__()方法
类名和该类名对应的对象名就变成了不可哈希-可变的,不能作为字典的key了 二、今日主要内容
1、 issubclass type isinstance
issubclass(类名1,类名2) #判断参数1是否是参数2的后代(子类,孙子类),是的话,返回True type 给出xxx的数据类型,给出创建这个对象的类 isinstance 参数1-对象名 参数2-类名 判断对象是否是类及其子类的对象---重点1 2、如何分辨方法和函数
在外面定义的函数一定是函数
在类中:
1. 普通方法: 如果是对象访问.方法,, 如果是类名访问是函数
2. 静态方法: 都是函数
3. 类方法: 都是方法
4、属性:是变量(不是函数,也不是方法) isinstance(args,MethodType)和isinstance(args,FunctionType)
是用于判断函数的参数是方法还是函数类型
参数可以是(普通方法名、静态方法名、类方法名、属性) 3、反射--重点2
1、重点
getattr(对象名,函数名或者变量名)
参数列表:参数1是对象或者类,参数2是要查找的函数名或者变量名
作用:从对象中(对象或者类中)查找指定的内容
使用:找到后将内存地址存在变量中,变量名后面加上小括号,就是调用函数
ret1 = getattr(p1,'eat') #或者函数eat的内存地址
ret1() #函数的内存地址后面加上小括号 hasattr(对象名,函数名或者变量名)
参数列表:参数1是对象或者类,参数2是要查找的函数名或者变量名
作用:判断对象中(对象或者类中)是否有你要查找的指定内容 和if
使用:有的话,就接着使用getattr
没有的话,就提示没有你要找的指定内容
if hasattr(p1,'eat'): #注意点:函数名加上引号
ret1 = getattr(p1,'eat') #或者函数eat的内存地址
ret1() #函数的内存地址后面加上小括号
else:
print('你要查找的内容不存在') 2、次重点 在内存层面修改,文件并没有修改
setattr(对象名,变量名,变量值)
参数列表:参数1是对象或者类,参数2是变量名,参数3是变量的值
作用:给对象(对象或者类)的构造方法中,新增一个变量--内存层面,临时增加
setattr(p1,'age',18) #注意点:变量名要加上引号 delattr(对象名,变量名)
参数列表:参数1是对象、类、模块py文件,参数2是变量名
作用:删除类中构造方法的一个变量--内存层面,临时删除
delattr(p1,'age') #注意点:变量名要加上引号
delattr(p1,'name') #从对象中删除变量(成员变量)
delattr(Person,'eat') #从类中删除函数eat
delattr(master,'eat') #从模块py文件中删除方法eat 前19天小结
1、基本数据结构
2、三大器(迭代器、生成器、装饰器)
3、面向对象
4、反射 '''
Python【day 19】反射的更多相关文章
- python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态
一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- python中的反射
在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...
- Python基础之反射
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- python面向对象进阶 反射 单例模式 以及python实现类似java接口功能
本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...
- Python之路- 反射&定制自己的数据类型
一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...
- Python 面向对象之反射
Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...
- Python面向对象之-反射
Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr 判断是否有改属性或者方法,有返回True,没有返回false getattr 如果是属性获得该属性 ...
- Python Python中的反射机制
Python中的反射机制 by:授客 QQ:1033553122 概念 借用java中的定义:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方 ...
- 十九. Python基础(19)--异常
十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try: <............. ...
- 「Python」19个python编写技巧
1. 交换赋值 2. Unpacking 3. 使用操作符in 4. 字符串操作 5. 字典键值列表 6. 字典键值判断 7. 字典 get 和 setdefault 方法 8. 判断真伪 9. 遍历 ...
随机推荐
- Linux 常用命令——查看系统
有的时候别人给你一个登录方式,但是不知道是啥系统,看图就知道了 1.uname -a 查看电脑以及操作系统 2.cat /proc/version 正在运行的内核版本 3.cat /etc/is ...
- tkinter的listbox、radiobutton和checkbutton学习(2)
1.tkinter的listbox 1.1 代码 #第1步,导出模块 import tkinter as tk #定义窗口,及其标题.大小和位置 win = tk.Tk() win.title('Li ...
- 吴裕雄 python 神经网络——TensorFlow 图像预处理完整样例
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt def distort_color(image, ...
- Python数据分析之Numpy操作大全
从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...
- 通过aptitude降级包解决依赖问题(E:无法修正错误,因为您要求某些软件包保持现状)
Linux下的依赖关系令人头疼,尤其是提示如下错误的时候: 下列软件包有未满足的依赖关系: xxx : 依赖: xxx 但是它将不会被安装 E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破 ...
- floyd的魔改应用——洛谷P2419 [USACO08JAN]牛大赛Cow Contest 题解
想找原题请点击这里:传送门 原题: 题目背景 [Usaco2008 Jan] 题目描述 N ( ≤ N ≤ ) cows, conveniently numbered ..N, are partici ...
- Nginx+Openssl实现HTTPs(重点)
[root@localhost ~]# rz -E //导入jdk源码包 z waiting to receive.**B0100000023 ...
- java中关于&0xFF 的问题
最近遇到一个问题,半天也没想明白,byte temp = 0xA0,为什么System.out.println(temp),打印的值为:-96:而System.out.println(temp& ...
- 0X01应用程序黑客技术
前言 该文章主要是讲解了常见的应用程序黑客技术基本概念,包括消息钩取,API钩取,DLL注入,代码注入 天象独行 0X01:消息钩取 原理:在我们通过键盘,鼠标等输入信息过程中,Windows会通过钩 ...
- Linux下清空文件的3种方法
1.echo -n > test.log #-n选项可以去掉空行 2.cat /dev/null > test.log 3.truncate -s 0 test.log