反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射。
反射有四种方法:
hasattr:hasattr(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False
getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr和getattr配套使用
需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()
setattr:给对象的属性赋值,若属性不存在,先创建后赋值
delattr:删除该对象指定的一个属性
hasattr 和getattr
#!/usr/bin/env python # -*- coding:utf-8 -*- class Foo: def __init__(self): self.name = 'egon' self.age = 51 def func(self): print('hello') egg = Foo() print(hasattr(egg,'name')) #先判断name在egg里面存在不存在 print(getattr(egg,'name')) #如果为True它才去得到 print(hasattr(egg,'func')) print(getattr(egg,'func')) #得到的是地址 # getattr(egg,'func')() #在这里加括号才能得到,因为func是方法 if hasattr(egg,'func'): getattr(egg,'func')() else: print('没找到')
class Foo: def __init__(self): self.name = 'egon' self.age = 51 def func(self): print('hello') egg = Foo() setattr(egg,'sex','男') print(egg.sex) #男 # 2. def show_name(self): print(self.name+'sb') setattr(egg,'sh_name',show_name) egg.sh_name(egg) show_name(egg) #egonsb #egonsb
delattr(egg,'name') print(egg.name)