"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Time : 2021/1/22 20:11
@Author : xibo.zhu
@Site :
@File : 反射.py
@Software: PyCharm
"""
"""
反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法:
getattr 获取指定字符串名称的对象属性
setattr 为对象设置一个对象
hasattr 判断对象是否有对应的对象(字符串)
delattr 删除指定属性
attr是属性英文的前几个字母,属性指的是类中类变量、实例变量和方法。但是要注意不能是私有的,如果你的变量是以“_”开头,那将无法获取。
"""
class TestObj(object):
def __init__(self, name, age):
self.name = name
self.age = age
def displayName(self):
print("displayName方法执行,打印姓名:", self.name)
def AAA(self):
print("I am AAA.")
def main():
to = TestObj("Tom", 23)
# 查看 to 实例里面是否有 name 这个属性
if hasattr(to, "name"):
print("实例 to 中有 name 属性。")
#获取对应属性
print(getattr(to, "name"))
else:
print("实例 to 中没有 name 属性。")
if hasattr(to, "displayName"):
print("实例 to 中有 displayName 属性。")
getattr(to, "displayName")()
else:
print("实例 to 中没有 displayName 属性。")
if hasattr(to, "AAA"):
print("实例 to 中有 AAA 属性。")
getattr(to, "AAA")()
else:
print("实例 to 中没有 AAA 属性,将会设置。")
setattr(to, "AAA", AAA) # 参数:实例、方法名称、具体方法 相当于 to.AAA = AAA 第一个AAA是函数在实例中的名称, 第二个AAA是把哪个函数放进去,两者只是恰好这里名称一样
# to.AAA(to) # 这里一定要主动传递一个实例进去,因为它不会自动装配self
getattr(to, "AAA")(to)
if __name__ == '__main__':
main()
![]()