python学习之类的反射
在学习网络编程的时候用到反射,然后发现自己反射这部分的应用不是很熟练,决定返回来重新整理一下
对于类的反射,主要有四个用法,下面都说一下
1.hasattr 判断对象或者类是否存在指定的属性,看代码以及结果
class people:
def __init__(self,name,age):
self.name = name
self.age = age def talk(self):
print("%s is talking."%self.name) p1 = people('alex',18)
print(hasattr(p1,'name'))
print(hasattr(p1,'sex')) 结果
True
False
hasattr判断完成后,会返回一个布尔值,有就返回True,无就返回False
2.getattr 获取到一个对象或者类的属性,加()就是执行,看代码
class people:
def __init__(self,name,age):
self.name = name
self.age = age def talk(self):
print("%s is talking."%self.name) p1 = people('alex',18)
print(getattr(p1,'name'))
print(getattr(p1,'sex','man'))
print(getattr(p1,'sex')) 结果
alex
man
File "D:/PycharmProjects/s2018/day6/test.py", line 13, in <module>
print(getattr(p1,'sex'))
AttributeError: 'people' object has no attribute 'sex'
对于getattr,如果对象或者是类有输入的属性,则,返回正确属性。无则报错,如果我们指定默认值,则返回默认值,在看一下其他
class people:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex def talk(self):
print("%s is talking."%self.name) p1 = people('alex',18,'woman') getattr(p1,'talk')()#getattr获取到方法后加()就是执行
print(getattr(p1,'sex','man'))#类内如果对属性已经确认过,显示对象已经确认的值,而不显示默认值 结果
alex is talking.
woman
3.setattr 是修改已有的属性或者是新加一个属性,看代码
class people:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex def talk(self):
print("%s is talking."%self.name) p1 = people('alex',18,'woman') print('修改前',p1.age)
setattr(p1,'age',20)
print('修改后',p1.age)
setattr(p1,'country','China')
print(p1.__dict__) 结果
修改前 18
修改后 20
{'country': 'China', 'name': 'alex', 'sex': 'woman', 'age': 20}
4.delattr就是对现有的对象或者类的属性就行删除,这个比较简单,看代码
class people:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex def talk(self):
print("%s is talking."%self.name) p1 = people('alex',18,'woman') print('修改前',p1.__dict__)
delattr(p1,'name')
print('修改后',p1.__dict__) 结果
修改前 {'age': 18, 'name': 'alex', 'sex': 'woman'}
修改后 {'age': 18, 'sex': 'woman'}
5.学会基本的,还是需要一些应用才可以,写一个比较的应用,正好也是我在网络编程中需要的,看代码
class Servers:#定义一个服务器类
def run(self):#定义方法run
while True:
cmds = input(">>>>:").strip().split()#将输入的命令行进行分解,分解成前面命令以及后面的文件名
if hasattr(self,cmds[0]):#判断是否有命令!
func = getattr(self,cmds[0])#如果命令存在则执行
func(cmds)
else:
print('你的输入错误!')
continue def get(self,cmds):#演示
print('get.....',cmds[1]) def put(self,cmds):#演示
print('put.....',cmds[1]) obj = Servers()
obj.run() 结果
>>>>:get a.txt
get..... a.txt
>>>>:put a.txt
put..... a.txt
>>>>:gett a
你的输入错误!
>>>>:
以上就是类的反射的一些基本应用,任何知识都是基本简单,组合难,就看大家如何组合了,后面又想到其他想法,也会再去更新这个
2018.6.18
python学习之类的反射的更多相关文章
- python学习笔记__反射
反射 # 通过字符串的形式对对象中的成员进行操作(获取/查找/添加/删除). 操作的内置函数: 1.获取 getattr(object, name) # 去对象object中获取name的内容 c ...
- Python学习系列之反射
反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去某个对象中寻找成员 根据字符串的形式去某个对象中设置成员 根据字符串的形式去某个对象中删除成员 根据字符串的形式去某个对象中判断成员 ...
- day28 python学习反射 sinstance和issubclass
isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 判断这个对象是不是这个类,或者是不是这个类的子类的实例化 class Foo( ...
- Python学习记录day6
title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...
- Python学习总结:目录
Python 3.x总结 Python学习总结[第一篇]:Python简介及入门 Python学习总结[第二篇]:Python数据结构 Python学习总结[第三篇]:Python之函数(自定义函数. ...
- Java学习:注解,反射,动态编译
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解 什么是注解 ? Annotat ...
- Python学习(二)Python 简介
Python 简介 官方指南及文档 Python2.7官方指南(中文版):http://pan.baidu.com/s/1dDm18xr Python3.4官方指南(中文版):http://pan.b ...
- python学习之旅
python学习分类 python基础 +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...
- Python学习之==>面向对象编程(二)
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
随机推荐
- Python的魔法函数
概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python # -*- codi ...
- 在.NET Core中使用简单的插件化机制
前言 插件化,其实也并不是什么新东西了,像nopCommerce等开源项目都有类似的机制,而且功能比较完善和齐全. 相信大家都对接过不少支付方式,支付宝.微信以及各大银行或第三方的支付公司. 我们可以 ...
- [四] java8 函数式编程 收集器浅析 收集器Collector常用方法 运行原理 内部实现
Collector常见用法 常用形式为: .collect(Collectors.toList()) collect()是Stream的方法 Collectors 是收集器Collect ...
- DHTMLX 常用技术
GRID的行设置前景色和背景色 $dataItem->set_row_color("red"); // 设置背景色 $dataItem->set_row_style(& ...
- Perl多线程(2):数据共享和线程安全
线程数据共享 在介绍Perl解释器线程的时候一直强调,Perl解释器线程在被创建出来的时候,将从父线程中拷贝数据到子线程中,使得数据是线程私有的,并且数据是线程隔离的.如果真的想要在线程间共享数据,需 ...
- 修复UEFI模式下Manjaro Linux启动问题
上周在更新Manjaro Linux的时候误触了电源键,导致内核更新了一半系统强制关机,重启时正常进入grub但无法正常引导进入系统. 由于不想重装系统(一大堆环境和工具的配置还是相当繁琐的),加上初 ...
- .Net语言 APP开发平台——Smobiler学习日志:在手机应用开发中如何快速调用电话拨打功能
样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobiler Components”拖动一个PhoneButton控件到窗体界面上 2.修改PhoneButton ...
- ORA-01940 无法删除当前已连接的用户之解决方案
在执行drop user的时候,提示报错信息:ORA-01940: cannot drop a user that is currently connected SQL> drop user l ...
- C++系列总结——mutable关键字
介绍 mutable的中文意思是易变的,是C++的一个关键字.它的作用就是允许修改被const修饰的对象的成员变量. 常用场景 什么情况下我们会使用到mutable? 一般我们会用const修饰get ...
- 从淘宝和网易的font-size思考移动端怎样使用rem?
最近翻了一下关于移动端的rem的使用,怎样最方便.在读到流云诸葛的一篇关于<从网易与淘宝的font-size思考前端设计稿与工作流>的文章后,来总结一下. 然而根据我以往做移动端web项目 ...