反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
1.反射的4种用法:
- 判断object中有没有一个name字符串对应的方法或属性(hasattr)
- 对属性的增加修改的方法(setattr)
- 对属性的删除方法(delattr)
- 对属性的查询方法(getattr)
1.判断object中有没有一个name字符串对应的方法或属性(hasattr)
class Foo:
x = 10
def __init__(self,name):
self.name = name
def say_info(self):
print("say hello %s" % self.name)
f = Foo("xiaoming")
print(f.__dict__["name"])
print(hasattr(f,"name"))
# 也可以获取 类中的其他属性是否存在;
print(hasattr(f,"say_info"))
print(hasattr(f,"x"))
输出:
xiaoming
True
True
True
2.对属性的增加修改的方法(setattr)
class Foo:
x = 10
def __init__(self,name):
self.name = name
def say_info(self):
print("say hello %s" % self.name)
f = Foo("xiaoming")
print(f.__dict__)
setattr(f,"age",18)
print(f.__dict__)
输出:
{'name': 'xiaoming'}
{'age': 18, 'name': 'xiaoming'}
3.对属性的查询方法(getattr)
class Foo:
x = 10
def __init__(self,name):
self.name = name
def say_info(self):
print("say hello %s" % self.name)
f = Foo("xiaoming")
# 对数据进行获取,如果有就返回获取的值,没有可以设置第三值或None
print(getattr(f,"name",None))
print(getattr(f,"abcd",None))
输出:
xiaoming
None
4.对属性的删除方法(delattr)
class Foo:
x = 10
def __init__(self,name):
self.name = name
def say_info(self):
print("say hello %s" % self.name)
f = Foo("xiaoming")
setattr(f,"age",18)
print(f.__dict__)
# 删除name这个属性方法
delattr(f,"name")
print(f.__dict__)
输出:
{'name': 'xiaoming', 'age': 18}
# 删除后只剩下age
{'age': 18}
2.将用户输入的命令,通过反射的方法映射到相应的函数方法上:
1 . 通过反射,用户输入的内容来执行相应的方法
class FtpServer:
def __init__(self,host,port):
self.host = host
self.port = port
def run(self):
while True:
cmd = input(">>>:").strip()
if not cmd:continue
# 注释方法也行
# getcmd = getattr(self,cmd,None)
# if not getcmd:continue
# getcmd()
if hasattr(self,cmd):
func = getattr(self,cmd)
func()
def get(self):
print("this get!")
def put(self):
print("this put!!")
f = FtpServer("192.168.1.1","21")
f.run()
输出:
>>>:get
this get!
>>>:put
this put!!