一: 概述
Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性或者方法
- hasattr 判断是对象否有改属性或者方法,有就返回True,没有就返回false
- getattr 如果是属性获得该属性的值,如果是方法获得该方法的内存地址
二: 在模块中使用反射
两个文件,main,py,start,py 即Python的模块
mian.py文件内容如下
def func1():
print('func1') def func2():
print('func2')
start.py文件内容如下
print(hasattr(main,'func1'))
print(hasattr(main,'func2'))
print(hasattr(main,'func3'))
执行如果如下
True
True
False
三: Python 面向对象中使用反射
class Person:
role = 'person'
def __init__(self,name):
self.name = name def walk(self):
print("%s is walking"%self.name) wangys = Person('wangys') print(hasattr(wangys,'role'))
print(hasattr(wangys,'name'))
print(hasattr(wangys,'walk'))
print(hasattr(wangys,'eat'))
True
True
True
False print(getattr(wangys,'role'))
print(getattr(wangys,'name'))
print(getattr(wangys,'walk'))
getattr(wangys,'walk')() person
wangys
<bound method Person.walk of <__main__.Person object at 0x00000216037DDA90>>
wangys is walking
通常hasattr跟getattr结合使用
class Person:
role = 'person'
def __init__(self,name):
self.name = name def walk(self):
print("%s is walking"%self.name) wangys = Person('wangys') if hasattr(wangys,'role'):
print(getattr(wangys,'role')) if hasattr(wangys,'walk'):
getattr(wangys,'walk')() if hasattr(wangys,'eat'):
getattr(wangys,'eat')()
else:
print('没有改方法') person
wangys is walking
没有改方法