反射

1.什么是反射

现有一个字符串,你希望能够将这个字符串转成变量名,这个变量名可以是(类名\函数名\变量名\方法名\对象名),

反射: 某个命名空间中的某个"变量名",获取这个变量名对应的值

class Manager:pass
class Student:pass
class Teacher:pass
identify = 'Student'
print(eval(identify)()) #这样就可以执行实例化了,但是eval不安全

反射类中的属性

class Person:
    role = '人类'
    country = '中国'
attr = input('>>>')
if hasattr(Person,attr): #输入正确返回Ture,输入错误返回Fasle
    print(getattr(Person,attr)) #(类名,值)

反射类中的方法

class Person:
    role = '人类'
    @staticmethod
    def show_courses():
        print('所有课程')
ret = getattr(Person,'show_courses')
print(ret)
ret(

 

a.b 类型
类名.静态属性/类名.类方法/类名.静态方法
list
对象.对象属性/对象.普通方法/对象.类方法/对象.静态方法

 

调用属性和方法

class A:
    def __init__(self,name):
        self.name = name

    def eat(self):
        print('%s is eating'%self.name)

wl = A('wanglna')
if hasattr(wl,'name'):
    print(getattr(wl,'name'))
if hasattr(wl,'eat'):
    getattr(wl,'eat')()

 

通过类名反射

getattr(类名,'静态属性')
getattr(类名,'类方法')()
getattr(类名,'静态方法')

通过对象名反射

getattr(对象名,'对象属性')
getattr(对象名,'普通方法')()
getattr(对象名,'类方法')()
getattr(对象名,'静态方法')()

通过模块反射

getattr(模块,'全局变量')
getattr(模块,'函数名')

反射全局变量的值(反射本文件中的名字)

from sys import modules
a = 1
b = 2
lst = [1,2,3]
class Manager:pass
class Student:pass
class Teacher:pass
getattr(modules[__name__],'Student')
identify = input('>>>').strip()
# 类 = getattr(modules[__name__],identify)
# print(类)
# 对象 = 类()
# print(对象)

 

posted @ 2018-11-26 20:37  答&案  阅读(123)  评论(0编辑  收藏  举报