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