python--反射(二)

简介: python--反射

delattr


def bulk(self):  # 装到类里必须要有self
    print('%s in the bulking...' % self.name)
class Dog(object):
    def __init__(self, name):
        self.name = name
    def eat(self, food):
        print('%s is eating...' % self.name, food)
d = Dog('张三')
choice = input('请输入>>:').strip()
if hasattr(d, choice):
    delattr(d, choice)  # 删除属性,
else:  # 输入的类里面的方法里没有
    setattr(d, choice, bulk)  # 等价于d.choice=bulk,动态加了个方法
    d.talk(d)  # 执行输入的,相当于执行了bulk,要把类对象传给,必须是d.输入的内容
print(d.name)

输入name

 

输入name,最后打印报错,因为属性name已经被删除了


反射应用的例子


import sys
class Manager:
    OPERATE_DIC = [
        ('创造学生账号', 'create_student'),
        ('创建课程', 'create_course'),
        ('查看学生信息', 'check_student_info'),
    ]
    def __init__(self, name):
        self.name = name
    def create_student(self):
        print('创建学生账号')
    def create_course(self):
        print('创建课程')
    def check_student_info(self):
        print('查看学生信息')
class Student:
    OPERATE_DIC = [
        ('查看所有课程', 'check_course'),
        ('选择课程', 'choose_course'),
        ('查看已选择的课程', 'choosed_course')
    ]
    def __init__(self, name):
        self.name = name
    def check_course(self):
        print('check_course')
    def choose_course(self):
        print('choose_course')
    def choosed_course(self):
        print('查看已选择的课程')
def login():
    username = input('请输入user : ')
    password = input('请输入pwd : ')
    with open('user_info') as f:
        for line in f:
            user, pwd, ident = line.strip().split('|')  # ident = 'Manager'
            if user == username and pwd == password:
                print('登录成功')
                return username, ident
def main():
    usr, id = login()
    print('user,id :', usr, id)
    file = sys.modules['__main__']  # 获取到该文件的内存对象
    cls = getattr(file, id)  # Manager = getattr(当前文件,'Manager')
    # cls ==< class '__main__.Manager'>
    obj = cls(usr)  # 实例化类
    operate_dic = cls.OPERATE_DIC  # 调用类下的静态属性
    while True:
        for num, i in enumerate(operate_dic, 1):
            print(num, i[0])
        choice = int(input('num >>>'))
        choice_item = operate_dic[choice - 1]
        getattr(obj, choice_item[1])()  # 执行类下的方法
main()

 

当输入 zou 和123456 时

请输入user : zou
请输入pwd : 123456
登录成功
user,id : zou Manager
1 创造学生账号
2 创建课程
3 查看学生信息
num >>>2
创建课程
1 创造学生账号
2 创建课程
3 查看学生信息
num >>>3
查看学生信息
1 创造学生账号
2 创建课程
3 查看学生信息
num >>>

当输入 test 666时

请输入user : test
请输入pwd : 666
登录成功
user,id : test Student
1 查看所有课程
2 选择课程
3 查看已选择的课程
num >>>1
check_course
1 查看所有课程
2 选择课程
3 查看已选择的课程
num >>>2
choose_course
1 查看所有课程
2 选择课程
3 查看已选择的课程
num >>>3
查看已选择的课程
1 查看所有课程
2 选择课程
3 查看已选择的课程

相关文章
|
6月前
|
测试技术 API 数据库
Python反射机制在实际场景中的应用
Python 的反射机制是指在运行时动态地访问、检测和修改类和对象的属性和方法。:通过反射机制,可以动态加载和执行插件,无需在代码中硬编码每个插件的具体实现。这样可以实现插件化架构,使系统更加灵活和可扩展。:可以使用反射机制来读取和解析配置文件中的配置项,并动态地应用到程序中。这样可以实现灵活的配置管理,方便根据需要进行配置项的修改和扩展。:在自动化测试框架中,可以利用反射机制动态地加载和执行测试用例,从而实现自动化测试的灵活性和扩展性。
65 2
|
7月前
|
Python
python反射
python反射
|
5月前
|
程序员 开发者 Python
Python动态属性与反射机制方式
通过反射和动态属性,Python程序员获得了巨大的权能,能在运行时访问、修改或为对象新增属性和方法,显著提高编程的智能化和适应性。内置的反射机制可能使开发者跨越编写代码时的限制,通过名称访问对象的特性、方法以及其他成员,为创建一个具有高度配置性、扩展性强大的应用程序打下基础。此外,利用getattr和setattr函数来获取和设定对象的属性,或是利用hasattr确认其是否存在某属性,甚至可以通过名字来动态地执行对象的函数。 总之,反射和动态属性对于Python的程序开发而言是重要的工具,它们不仅提供了编写效率高且灵活的代码的能力,还为构建可高度定制和扩展的应用程序提供了可能。对于熟练掌握这些
|
6月前
|
安全 Python
深入浅出Python反射机制
1. 什么是反射 简单来说,反射就是程序在运行时能够"观察"自己,获取、检查和修改自身状态或行为的一种能力。听起来有点抽象?别急,我们慢慢道来。 在Python中,反射允许我们在代码运行时: • 查看对象有哪些属性和方法 • 获取属性的值 • 调用对象的方法 • 甚至动态地添加或修改属性和方法
|
6月前
|
Python
python反射 , 异常处理
python反射 , 异常处理
|
6月前
|
网络架构 Python
python的反射机制
python的反射机制
27 0
|
6月前
|
Python
Python反射和异常处理
Python反射和异常处理
|
7月前
|
Python
Python中的反射
Python中的反射
135 5
|
测试技术 Python
Python--getattr反射+selenium详解篇
Python--getattr反射+selenium详解篇
84 0