一、反射

一、什么是反射

把字符串映射到实例的变量或者实例的方法,然后可以去进行调用、修改操作.Python的反射机制(Reflection)指的是程序能够检查和修改其自身结构或行为的能力。在Python中,由于语言的动态特性,反射通常通过内建函数
(如getattr(), setattr(), hasattr(), delattr(), dir(), callable(), isinstance(), issubclass()等)和一些其他特性(如__getattr__()和__setattr__()等魔术方法)来实现。

二、反射的四大操作

getattr(object, name[, default]):  # 获取对象object的名为name的属性。如果属性不存在,则返回default(如果提供了)。
setattr(object, name, value): # 设置对象object的名为name的属性的值为value。
hasattr(object, name): # 检查对象object是否有一个名为name的属性。
delattr(object, name): # 删除对象object的名为name的属性。
dir(object): # 返回对象的属性列表,包含对象的所有方法和变量(包括从基类继承的)。
callable(object): # 检查对象object是否可以被调用(即,它是否实现了__call__()方法)。
isinstance(object, classinfo): # 检查对象object是否是一个类(或元组中的类之一)的实例。
issubclass(class, classinfo): # 检查类class是否是类classinfo的子类(或元组中的类之一)
class Reflection:
    def __init__(self, name, age):
        """
        init
        """
        self.name = name
        self.age = age

    def welcome(self):
        print("欢迎你加入组织!")

    def learning(self):
        print("正在学习,拉开差距")


def func_learning():
    print("函数(类外)")


if __name__ == '__main__':
    reflect = Reflection("王勇", 29)
    # 获取实例属性
    # print(reflect.name, reflect.age)
    # 1. getattr 获取对象属性/方法
    name = getattr(reflect, "name")  # #把字符串映射到实例的变量
    print(name, type(name))  # 王勇 <class 'str'>
    age = getattr(reflect, "age")
    print(age, type(age))  # 29 <class 'int'>

    # 获取实例方法
    method = getattr(reflect, "welcome")  # #映射到实例的方法
    # <bound method Reflection.welcome of <__main__.Reflection object at 0x00E1DD10>> <class 'method'>
    print(method, type(method))
    # 执行方法
    method()

    # 2、hasattr判断对象是否有对应的属性或者方法
    # if hasattr(reflect, "name"):
    if hasattr(reflect, "learning"):
        print("正在学习")
    else:
        print("熬夜学习中。。。")

    # 3、setattr 设置(修改)对象的内容(属性/方法)
    setattr(reflect, "name", "薇薇")  # 修改对象的属性
    name = getattr(reflect, "name")
    print(f"被修改的对象属性:{name}")  # 被修改的对象属性:薇薇
    # 类的外部的函数映射到类里面的方法,增加类中的方法
    setattr(reflect, "func_learning", func_learning)
    getattr(reflect, "func_learning")()  # # 函数(类外)
    reflect.func_learning()  # 函数(类外)
    
    # 4、delattr删除指定属性
    delattr(reflect, "age")
    # print(reflect.age)  # AttributeError: 'Reflection' object has no attribute 'age'

 

class Practice:

    def login(self):
        print("登录")

    def register(self):
        print("注册")

    def logout(self):
        print("注销")

    def run(self):
        choice = {
            "1": "login",
            "2": "register",
            "3": "logout",
        }
        num = input(choice)
        action = getattr(self, choice[num])

        action()


if __name__ == '__main__':
    Practice().run()

 

posted on 2024-09-15 16:14  软饭攻城狮  阅读(2)  评论(0编辑  收藏  举报

导航