反射

反射:通过字符串的形式来操作对象属性。

1、对象反射

1、getattr 获取指定的对象属性

变量名 = getattr(对象 , '对象属性'  , 设置默认值)
# 设置默认值:指当在对象中查找不到对应的对象顺序ing是返回的内容 , 如果没有设置默认是并且属性不存在就会报错。

2、setattr去对象中设置一个对象属性

setattr(对象,'对象属性' , 值)

3、hasattr判断对象是否有对应的对象属性

变量名 = hasattr(对象 , '对象属性')
# 返回bool类型

4、delattr删除指定对象的属性

delattr(对象,'对象属性')
class A:

    def __init__(self , name , age):
        self.name = name
        self.age = age

    def say_hi(self):
        print(f'hi , {self.name}')


ddg = A('大大怪' , 24)
print(ddg.name)
ddg.say_hi()

# 变量名 = getattr(对象 , '对象属性')
nn = input('请输入要查看属性名:')
n = getattr(ddg, nn, '属性方法找不到')
print(n)

# setattr(对象,'对象属性' , 值)
setattr(ddg , 'name' , '小小怪')
setattr(ddg , 'height' , 1.89)
print(ddg.name)
print(ddg.__dict__)


# 变量名 = hasattr(对象 , '对象属性')

bol = hasattr(ddg , 'weight')
print(bol)
res = hasattr(ddg , 'height')
print(res)

# delattr(对象,'对象属性')

# delattr(ddg , 'say_hi')    # 报错 , 不能删除方法
delattr(ddg , 'age')
print(ddg.__dict__)

实例:

class User:

    def login(self):
        print('这是微信登录页面')

    def register(self):
        print('这是一个微信注册')

    def speak(self):
        print('这是聊天页面')


# 未使用反射
# ddg = User()
# choose = input('请输入你要操作的功能:')
# if choose == 'login':
#     ddg.login()
# elif  choose == ' register':
#     ddg.register()
# elif choose == 'speak':
#     ddg.speak()
# else:
#     print('输入有误')


# 使用反射
xxg = User()
choose = input('请输入你要操作的功能:')
if hasattr(xxg , choose):
    fun = getattr(xxg , choose)
    fun()
else:
    print('没有这个功能')