在学习网络编程的时候用到反射,然后发现自己反射这部分的应用不是很熟练,决定返回来重新整理一下

对于类的反射,主要有四个用法,下面都说一下

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学习之类的反射的更多相关文章

  1. python学习笔记__反射

    反射 # 通过字符串的形式对对象中的成员进行操作(获取/查找/添加/删除). 操作的内置函数: 1.获取   getattr(object, name) # 去对象object中获取name的内容 c ...

  2. Python学习系列之反射

    反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去某个对象中寻找成员 根据字符串的形式去某个对象中设置成员 根据字符串的形式去某个对象中删除成员 根据字符串的形式去某个对象中判断成员 ...

  3. day28 python学习反射 sinstance和issubclass

    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 判断这个对象是不是这个类,或者是不是这个类的子类的实例化 class Foo( ...

  4. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  5. Python学习总结:目录

    Python 3.x总结 Python学习总结[第一篇]:Python简介及入门 Python学习总结[第二篇]:Python数据结构 Python学习总结[第三篇]:Python之函数(自定义函数. ...

  6. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

  7. Python学习(二)Python 简介

    Python 简介 官方指南及文档 Python2.7官方指南(中文版):http://pan.baidu.com/s/1dDm18xr Python3.4官方指南(中文版):http://pan.b ...

  8. python学习之旅

    python学习分类 python基础    +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...

  9. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

随机推荐

  1. 带着新人学springboot的应用01(springboot+mybatis+缓存 上)

    上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...

  2. 撸一撸Spring Cloud Ribbon的原理-负载均衡策略

    在前两篇<撸一撸Spring Cloud Ribbon的原理>,<撸一撸Spring Cloud Ribbon的原理-负载均衡器>中,整理了Ribbon如何通过负载均衡拦截器植 ...

  3. Java读取Excel指定列的数据详细教程和注意事项

    本文使用jxl.jar工具类库实现读取Excel中指定列的数据. jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的.这套API是纯Java的,并不依赖Windows ...

  4. JS引擎线程的执行过程的三个阶段(二)

    继续JS引擎线程的执行过程的三个阶段(一) 内容, 如下: 三. 执行阶段 1. 网页的线程 永远只有JS引擎线程在执行JS脚本程序,其他三个线程只负责将满足触发条件的处理函数推进事件队列,等待JS引 ...

  5. JQuery——选择器

    简单介绍一下什么是选择器:选择器是CSS样式中用来选择页面元素的一个特有的方式,而JQuery的选择器同样也是如此,JQuery的选择器简单的分为一下这几种:1.常用的CSS选择器 标签选择器:E{ ...

  6. C#服务器控件 IsReadOnly 和 Visibility,IsEnable 的区别

    IsReadOnly  适用于“输入.输出”类控件,比如TextBox类, 可以当做文本输入,也可以通过后台代码进行输出. 设置 IsReadOnly(只读) = true 后,该控件只允许输出,不允 ...

  7. 永不重复的id生成器

    目录 (1)需要导入的包 (2)IdGenerator类 (3)使用举例 (1)需要导入的包 主要用在格式化日FastDateFormat.getInstance("yyyyMMddHHmm ...

  8. 关于token和refresh token

    最近在做公司的认证系统,总结了如下一番心得. 传统的认证方式一般采用cookie/session来实现,这是我们的出发点. 1.为什么选用token而不选用cookie/session? 本质上tok ...

  9. How to Apply Patches to a WLS 8.1 Environment

    APPLIES TO: Oracle Weblogic Server - Version 8.1 to 8.1Information in this document applies to any p ...

  10. 用WijmoJS搭建您的前端Web应用 —— React

    前文回顾 在本系列文章中,我们已经介绍了Angular和Vue框架下 WijmoJS 的玩法. 而今天,我们将展示如何使用 WijmoJS 来搭建一款具备独特创新性.出色性能和简单代码逻辑的 Reac ...