反射:通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法
1.getattr: 2.hasattr:判断一个对象里是否有对应(相同名称)字符串的方法 3.setattr 4.delattr
class Dog(object): def __init__(self,name): self.name = name def eat(self): print ('%s is eating...'% self.name) d = Dog('XiaoBai') choice = input('>>:').strip() #让用户输入项调用Dog类中的功能(方法) d.choice()
图中输入choice的内容是一个字符串,正常调用d.eat()这可不是一个字符串。 报错提示Dog中不存在attribute choice(字符串)
class Dog(object): def __init__(self,name): self.name = name def eat(self): print ('%s is eating...'% self.name) d = Dog('XiaoBai') choice = input('>>:').strip() print (hasattr(d,choice)) #判断对象d里是否有对应eat字符串的方法 #hasattr的全称就是hasattribute(有没有属性....) 执行结果: >>:eat True #通过这种方式就可以确认在class Dog中是否存在eat功能了 执行结果: >>:talk False
class Dog(object): def __init__(self,name): self.name = name def eat(self): print ('%s is eating...' % self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): #如果d中存在eat getattr(d,choice)() #就用getattr调用d.eat,后面不加括号的话就是打印内存信息了 #根据字符串去获取d对象里的方法的内存地址 执行结果: >>:eat XiaoBai is eating...
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): #设置food参数 print ('%s is eating...' % self.name,food) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): func = getattr(d,choice) #当前func==d.eat func('Bone') #将Bone传给food参数
setattr() 我们通过ctrl点进去setattr中
x表示对象 y被引号引着表示y是字符串 x.y=v v相当于值
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print ('%s is eating...' % self.name,food) def bulk(self): print ('%s is yelling.....' %self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): func = getattr(d,choice) func('Bone') else: setattr(d,choice,bulk) #将bulk赋值给choice(这里choice=talk,也就相当于赋值给talk) d.talk(d) #这里choice=talk,这里d.talk=bulk,bulk本身是一个函数内存地址,将这个内存地址赋值给了talk,当前talk相当于bulk这个函数了,所以调用d.talk就相当于调用bulk这个函数,而d.bulk则是不存在的. 执行结果: >>:talk XiaoBai is yelling.....
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print ('%s is eating...' % self.name,food) def bulk(self): print ('%s is yelling.....' %self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): func = getattr(d,choice) func('Bone') else: # setattr(d,choice,bulk) # d.talk(d) setattr(d,choice,22) #建立一个新的、不存在的静态属性,赋予值22 print (getattr(d,choice)) 执行结果: >>:age #建立的静态属性名称为age,然后得到赋值22 22 执行结果: >>:name #这里输入已存在的变量名 Traceback (most recent call last): File "E:/Python/练习代码/A1.py", line 20, in <module> func('Bone') TypeError: 'str' object is not callable #因为name的值已经通过func = getattr(d,choice)获取了,不能通过func('Bone')这样调用
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print ('%s is eating...' % self.name,food) def bulk(self): print ('%s is yelling.....' %self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): setattr(d,choice,'LeLe') #设置已有属性的值(相当于更改了) else: # setattr(d,choice,bulk) # d.talk(d) setattr(d,choice,22) print (getattr(d,choice)) print (d.name) 执行结果: >>:name LeLe #可以看到已经不是XiaoBai了,是改过的LeLe
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print ('%s is eating...' % self.name,food) def bulk(self): print ('%s is yelling.....' %self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): delattr(d,choice) #删除属性 else: # setattr(d,choice,bulk) # d.talk(d) setattr(d,choice,22) print (getattr(d,choice)) print (d.name) 执行结果: >>:name #指定删除name这个属性 Traceback (most recent call last): File "E:/Python/练习代码/A1.py", line 28, in <module> print (d.name) AttributeError: 'Dog' object has no attribute 'name' #可以看到name属性已不存在
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print ('%s is eating...' % self.name,food) def bulk(self): print ('%s is yelling.....' %self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): getattr(d,choice) else: setattr(d,choice,None) print (d.choice) #这里是不能这么打印的,这里的choice只是单纯的一个叫choice的字符串,而不是choice = input输入的值。 AA = d.choice print (d.name) 执行结果: >>:age Traceback (most recent call last): File "E:/Python/练习代码/A2.py", line 25, in <module> print (d.choice) AttributeError: 'Dog' object has no attribute 'choice'
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print ('%s is eating...' % self.name,food) def bulk(self): print ('%s is yelling.....' %self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): getattr(d,choice) else: setattr(d,choice,None) AA = getattr(d,choice) #需要先通过getattr获取这个choice的值 print (AA) 执行结果: >>:age None
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print ('%s is eating...' % self.name,food) def bulk(self): print ('%s is yelling.....' %self.name) d = Dog('XiaoBai') choice = input('>>:').strip() if hasattr(d,choice): getattr(d,choice) else: setattr(d,choice,None) print (d.age) #这个age就是choice=input输入的值,因为age存在所以可以直接打印 AA = getattr(d,choice) #需要先通过getattr获取这个choice的值 print (AA) 执行结果: >>:age None #print (d.age) None #print (AA)
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句