面向对象进阶 反射

面向对象进阶

反射

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

getattr() 使用字符串数据类型的变量名获取属性值

hasattr() 使用字符串数据类型的变量名判断属性是否存在

setattr()  使用字符串数据类型的变量名获修改属性值

delattr() 使用字符串数据类型的变量名获删除属性值

复制代码
class Management:
    role = '管理员'
    def __init__(self,name,sex,phone,mail):
        self.name = name
        self.sex = sex
        self.phone = phone
        self.mail = mail
    def create_class(self):
        print('创建了一个班级')
    def create_teacher(self):
        print('新建了一条讲师信息')
    def create_student(self):
        print('新建了一条学生信息')

manager = Management('小雨','女',1233211234567,'xiaoyu@qq.com')
# func = input('func:')
# f = getattr(manager,func)
# f()
f = getattr(manager,'phone')  # 使用字符串数据类型的变量名获取属性值
print(f)
f = getattr(manager,'phone1','没有这个属性')  # 可以添加找不到的时候的默认值,不然会报错
print(f)
cs = getattr(manager,'create_class')  # 使用字符串数据类型的方法名调用方法
cs()
print(hasattr(manager,'name'))  # True
f = getattr(Management,'role')
print(f)

import logging
if hasattr(manager,'sex'):
    sex = getattr(manager,'sex')
    print(sex)
else:
    logging.warning('没有您输入的属性')

# Management.Country = 'China'
setattr(Management,'Country','China')
print(Management.Country)  # China
delattr(Management,'Country')

setattr(manager,'job','teacher')
print(manager.job)
delattr(manager,'job')

# 可以通过delattr删除一个类中的方法
delattr(Management,'create_class')

def create_course(self):
    print('创建了一个课程')
setattr(manager,'create_course',create_course)
manager.create_course(manager)
复制代码

对象的反射
类的反射
模块的反射
本模块的反射:找到本模块sys.modules[__name__]

aaa = 'bbb'
import sys
print(sys.modules['__main__'])
print(getattr(sys.modules['__main__'],'aaa'))  # bbb
print(sys.modules[__name__])
print(getattr(sys.modules[__name__],'aaa'))
posted @ 2017-11-24 20:22  邯城吴彦祖  阅读(153)  评论(0编辑  收藏  举报