python -- 面向对象:反射

7.6面向对象:反射

Python面向对象中的反射:通过字符串的形式操作对象相关的属性.Python中的一切事物都是对象(都可以使用反射).

7.6.1 对 对象的反射

class Foo:
    a = '类的静态变量'
    
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def func(self):
        print(666)
        
obj = Foo('Agoni',18)

# 检测是否含有某属性
print(hasatter(obj,'a'))
print(hasatter(obj,'name'))

# 获取属性
print(getatter(obj,'age'))
f = getatter(obj,'func')
f()
print(getatter(obj,'sex',None))  # 不存在,返回None,如果没有第三个参数会报错

# 设置属性
setatter(obj,'hobby','足球')
print(obj.hobby) # 足球

# 删除属性
delatter(obj,'name')
delatter(obj,'job')  # 不存在,会报错

7.6.2 对类的反射

class Foo:
	static_field = 'work'
    
    def __init__(self):
        self.name = 'Agoni'
        
    def func(self):
        return 'func'
    
print(hasatter(Foo,'name'))
print(getatter(Foo,'static_field'))
print(getatter(Foo,'func'))

7.6.3 当前模块的反射

def func():
	print(111)
import sys
this_modules = sys.modules[__name__]   
print(this_modules)
print(getatter(this_modules,'func1'))  # 得到func1的内存地址

class A:
    static = 'A类'
    
import sys
this_modules = sys.modules[__name__]  # 获取当前脚本这个对象
cls = getatter(this_modules,'A')      # 获取A类
obj = cls() # 实例化对象
print(obj.static)  # A类

7.6.4 其他模块的反射

#一个模块中的代码  module_test.py
def test():
    print('from the test')
    
# 另一个模块中的代码  当前文件
import module_test as obj
obj.test()
print(hasatter(obj,'test'))
getatter(obj,'test')()

7.6.5 反射的应用***

class Auth:
    
    def login(self):
        print('登录页面')
        
    def register(self):
        print('注册页面')
        
    def exit(self):
        print('退出...')
       
 while 1:
    obj = Auth()
    choice = input('请输入方法名').strip()
    if hasatter(obj,choice):
        func = getatter(obj,choice)  # choice 必须是个字符串
        func()
    else:
        print('输入错误')
posted on 2019-07-16 21:47  ShenQiang  阅读(134)  评论(0编辑  收藏  举报