反射哈哈

一. 模块里的反射

run.py

# by luffycity.com
from types import FunctionType
import handler
while True:
    print("""
    系统支持的函数有:
        1. f1
        2. f2
        3. f3
        4. f4
        5. f5
    """)
    val = input("请输入要执行的函数:") # val = "f1"

    # 错误  因为val是字符串
    # handler.val()
    if hasattr(handler,val):
        func_or_val = getattr(handler,val)     # 根据字符串为参数,去模块中寻找与之同名的成员。
        if isinstance(func_or_val,FunctionType):
            func_or_val()
        else:
            print(func_or_val)
    else:
        print('handler中不存在输入的属性名')

    # 正确方式
    """
    if val == 'f1':
        handler.f1()
    elif val == 'f2':
        handler.f2()
    elif val == 'f3':
        handler.f3()
    elif val == 'f4':
        handler.f4()
    elif val == 'f5':
        handler.f5()
    """

 

 handler

f0 = 9

def f1():
    print('F1')

def f2():
    print('F2')

def f3():
    print('F3')

def f4():
    print('F4')

def f5():
    print('F5')

 

 二.. 类里面的反射

1.

# by luffycity.com


class Foo(object):

    country = "中国"

    def func(self):
        pass


v = getattr(Foo,'func') # Foo.func # 根据字符串为参数(第二个参数),去类中寻找与之同名的成员。
print(v)
# <function Foo.func at 0x0000017EFD5F81E0>
obj = Foo()
v = getattr(obj,"func") # obj.func # 根据字符串为参数(第二个参数),去对象中寻找与之同名的成员。
print(v)
# <bound method Foo.func of <__main__.Foo object at 0x0000017EFD77C278>>

 

2. 

 

# class Account(object):
#     func_list = ['login', 'logout', 'register']
#
#     def login(self):
#         """
#         登录
#         :return:
#         """
#         print('登录111')
#
#     def logout(self):
#         """
#         注销
#         :return:
#         """
#         print('注销111')
#
#     def register(self):
#         """
#         注册
#         :return:
#         """
#         print('注册111')
#
#     def run(self):
#         """
#         主代码
#         :return:
#         """
#         print("""
#             请输入要执行的功能:
#                 1. 登录
#                 2. 注销
#                 3. 注册
#         """)
#
#         choice = int(input('请输入要执行的序号:'))
#         func_name = Account.func_list[choice-1]
#
#         # func = getattr(Account,func_name) # Account.login      #函数 self需要自己传
#         # func(self)    #self 是 obj1
#
#         func = getattr(self, func_name)  # self.login      #方法  self 不用自己传
#         func()
#
# obj1 = Account()
# obj1.run()
#
# obj2 = Account()
# obj2.run()

 

 补充:

"""
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,去判断对象动态的设置一个成员(内存级别设置后看不见)
delattr # 根据字符串的形式,去判断对象动态的设置一个成员(内存删除之后看不见)
"""

import xx

# getattr
v1 = getattr(xx,'x1')
print(v1)
v2 = getattr(xx,'f1')
v2('杨森')

# hasattr
v3 = hasattr(xx,'x1')
print(v3)
# v4 = hasattr(xx,'f1')
# v4 = hasattr(xx,'f1')
# v5 = hasattr(xx,'xxxxxxx')
# print(v3,v4,v5)
#
# # setattr
# setattr(xx,'x2',999)
# v6 = getattr(xx,'x2')
# print(v6)
#
# setattr(xx,'f2',lambda x:x+1)
# v7 = getattr(xx,'f2')
# v8 = v7(1)
# print(v8)

# delattr
delattr(xx,'x1')
v9 = getattr(xx,'x1')
print(v9)

 

posted @ 2018-11-14 00:00  2275114213  阅读(38)  评论(0)    收藏  举报