Python3学习之路~7.3 反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,该四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
hasattr(obj,name_str):判断一个对象obj里是否有name_str字符串对应的的方法或者属性
getattr(obj,name_str):相当于obj.name_str,根据字符串去获取obj对象里对应的方法的内存地址或对应属性的值
setattr(x, 'y', v) :相当于``x.y = v'',即通过字符串设置新的属性或方法
delattr(x, 'y'):相当于``del x.y'',删除对象obj里y字符串对应的属性
class Foo(object): def __init__(self):
self.name = 'wupeiqi' def func(self):
return 'func' obj = Foo() # #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func') # #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func') # #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')
反射代码示例1
反射代码示例2:
#Author:Zheng Na def bulk(self): #外部方法
print("%s is yelling..." % self.name) class Dog(object):
def __init__(self,name,age):
self.name = name
self.age = age def eat(self):
print("%s is eating..." %self.name) d = Dog("小黄",1)
choice = input("请输入属性或方法>>:").strip() if choice == "name":
# 判断对象中是否有字符串对应的属性
print(hasattr(d,choice)) # true # 根据字符串去对象中获取对应属性的值
attr = getattr(d,choice)
print(attr) # 小黄 # 修改对象中字符串对应属性的值
setattr(d,choice,"小白")
print(d.name) # 小白 # 删除对象中字符串对应的属性
delattr(d,choice)
print(d.name) # 报错:AttributeError: 'Dog' object has no attribute 'name' elif choice == "eat":
# 判断对象中是否有字符串对应的方法
print(hasattr(d, choice)) # true # 据字符串去获取obj对象里对应的方法的内存地址,然后调用这个方法
func = getattr(d,choice)
func() # 小黄 is eating... # 方法不能删除?还是我的用法有错?
# delattr(d, choice) # 报错:AttributeError: eat elif choice == "talk":
# 通过字符串设置新的方法,可动态地将一个外部的方法装配到类里
# bulk现在相当于一个变量名,你现在用talk来代替了
# 1.方法写死
# setattr(d,choice,bulk)
# d.talk(d) # 小黄 is yelling...
# 2.方法不写死
setattr(d,choice,bulk)
func = getattr(d,choice)
func(d) # 小黄 is yelling... else:# choice输入money
# 通过字符串设置新的属性
setattr(d, choice, 22)
print(getattr(d,choice)) # 22
3种方式获取obj对象中的name变量指向内存中的值 “alex”
class Foo(object): def __init__(self):
self.name = 'alex' def func(self):
return 'func' # 不允许使用 obj.name
obj = Foo() print(obj.name)
print(getattr(obj, 'name'))
print(obj.__dict__['name'])
Python3学习之路~7.3 反射的更多相关文章
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现
作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...
- Python3学习之路~8.5 SocketServer实现多并发
前面几节我们写的socket都只能实现服务端与一个客户端通信,并不能实现服务端与多客户端同时通信.接下来我们就来学习一下如何实现服务端同时与多个客户端通信,即并发. Socket Server soc ...
- Python3学习之路~9.4 队列、生产者消费者模型
一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...
- Python3学习之路
python基础知识点 1.python基础知识点汇总 2.python常用数据类型 3.python之列表 4.python之字符串 5.python常用数据运算符 6.python之字典 7.py ...
- Python3学习之路~9.1 paramiko模块:实现ssh执行命令以及传输文件
我们一般使用linux的时候,都是在Windows上安装一个ssh客户端连接上去.那么从一台linux如何连接到另一条linux呢?使用ssh命令即可,因为每台linux机器自己都有一个ssh客户端. ...
- Python3学习之路~8.4 利用socket实现文件传送+MD5校验
利用socket实现文件传送,大约分为如下几步: 1.读取文件名2.检测文件是否存在3.打开文件(别忘了最后关闭文件)4.检测文件大小5.发送文件大小给客户端6.等客户端确认7.开始边读边发数据8.m ...
- Python3学习之路~7.5 异常处理
1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except Excepti ...
- Python3学习之路~7.4 动态导入模块
动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块. 准备: 首先创建一个模块目录lib,然后在目录内创建一个模块 aa.py: # aa.pyclass C: def __ini ...
随机推荐
- Jupyter Notebook启动不会自动打开浏览器,每次都要自己打开浏览器输入网址
今天在使用jupyter 时,已启动服务,但每次都需要手动去浏览器 输入网址才可以, 最好找了好久才解决了. 去cmd 命令窗口执行jupyter notebook --generate-config ...
- mysql查看索引与锁
http://www.cnblogs.com/cocos/archive/2011/05/06/2039428.html Mysql乐观锁与悲观锁 http://www.cnblogs.com/esi ...
- Xilinx 7 Serial PUDC_B
PUDC_B管脚用途 Pull-Up During Configuration (bar) Active-Low PUDC_B input enables internal pull-up resis ...
- Aspnet Mvc 前后端分离项目手记(三)关于restful 风格Url设计
RESTful 不是新东西,简单理解它的核心思想就是最大程度的利用http协议的一些特点,比如uri,比如请求动词,在前后端分离的项目中会有大大的好处 ,好的设计的url简单明了,胜过详细的说明文档. ...
- ASP.NET Core 3.0预览版体验
目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3,对应ASP.NET Core 3.0 Preview 3. ASP.NET Core 3.0 之后将不再支持.NE ...
- 推荐常用的移动端、PC端、小程序的UI框架
1.移动端UI库 ①.Vant UI 官方地址:https://youzan.github.io/vant/#/zh-CN/intro github地址:https://github.com/youz ...
- java判断通常的逻辑
package com.stylefeng.guns.core.common.constant.factory; import com.baomidou.mybatisplus.mapper.Enti ...
- 构建Maven父子工程
IDEA构建maven父子工程: 1.打开IDEA,Create New Project 如图: 如果没有弹出新建界面,可以先 file-->Close Project 如图: 2.创建父 ...
- laravel之构造器操作数据库
使用构造器来查询的优点是可以方式sql注入 1.插入 2.修改数据库 3.删除 4.查询
- Windows系统maven安装配置
Apache Maven是一个软件项目管理工具,基于项目对象模型(Project Object Model,即POM)的概念,Maven可用来管理项目的依赖.编译.文档等信息.使用Maven管理项目时 ...