一、概述
反射我们以后会经常用到,这个东西实现了动态的装配,通过字符串来反射类中的属性和方法
二、反射函数
2.1 hasarttr(obj,name_str)
作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("{0} is eating...{1}".format(self.name,food))
d = Dog("shabi")
choice = input(">>>:").strip()
print(hasattr(d,choice)) #obj中是否有对应的choice字符串的属性或者方法
#输出
>>>:name #输入对象存在属性
True
>>>:eat #输入对象存在的方法
True
2.2 getattr(obj,name_str)
作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("{0} is eating...{1}".format(self.name,food))
d = Dog("shabi")
choice = input(">>>:").strip()
print(getattr(d,choice)) #choice获取obj对象中的对应方法的内存地址或者对应属性的值
#输出
>>>:name #返回name属性的值
shabi
>>>:eat
> #返回eat方法的内存地址
2.3 setattr(x,y,z)
作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''
①给对象新增一个新方法
def bulk(self): #先定义一个bulk函数
print("{0} is yelling...".format(self.name))
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("{0} is eating...{1}".format(self.name,food))
d = Dog("shabi")
choice = input(">>>:").strip()
setattr(d,choice,bulk) #输入的是talk,所以又等同于d.talk = bulk
#d.talk(d) 直接写死,用d.talk(d),一般不这么写
func = getattr(d,choice) #用getattr来获取
func(d)
#输出
>>>:talk
shabi is yelling...
②给对象新增一个属性
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("{0} is eating...{1}".format(self.name,food))
d = Dog("shabi")
choice = input(">>>:").strip()
setattr(d,choice,22) #输入的是age,所以又等同于d.age = 22
# print(d.age) 这样就写死了,还是用下面一种
print(getattr(d,choice))
#输出
>>>:age
22
2.4 delattr(x,y)
作用:删除obj对象中的属性或者方法,delattr(x, 'y') is equivalent to ``del x.y''
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("{0} is eating...{1}".format(self.name,food))
d = Dog("shabi")
choice = input(">>>:").strip()
delattr(d,choice) #根据字符串删除属性或者方法
print(d.name)
print(d.eat)
#输出
>>>:name #删除属性name
Traceback (most recent call last):
File "E:/PycharmProjects/pythontest/day7/反射/反射.py", line 22, in
print(d.name)
AttributeError: 'Dog' object has no attribute 'name'
>>>:eat #删除方法eat
Traceback (most recent call last):
File "E:/PycharmProjects/pythontest/day7/反射/反射.py", line 21, in
delattr(d,choice)
AttributeError: eat
三、综合使用
3.1 综合使用hasattr、getattr、setatt
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("{0} is eating...{1}".format(self.name,food))
d = Dog("shabi")
choice = input(">>>:").strip()
if hasattr(d,choice): #判断d对象中存在属性和方法
name_value = getattr(d,choice) #获取属性值
print(name_value)
setattr(d,choice,"hong") #修改属性值
print(getattr(d,choice)) #重新获取属性的值
else:
setattr(d,choice,None) #设置不存在的属性值为None
v = getattr(d,choice)
print(v)
#输出
>>>:name
shabi
hong
>>>:abc
None