反射

一.issubclass/type/isinstance

  1.issubclass :检查第一个参数是否是第二个参数的子子孙孙类

class Base:
    pass
class Foo(Base):
    pass
class Bar(Foo):
    pass
print(issubclass(Bar,Foo))
#结果:True

  2.type:获取当前对象是有那个类创建

class Foo:
    pass
obj = Foo()
print(obj,type(obj))   #获取当前对象是有那个类创建.
if type(obj ) ==Foo:
    print("obj是Foo类型")
def func(*args):
    foo_count = 0
    bar_count = 0
    for item in args:
        if type(item) ==Foo:
            foo_count += 1
        elif type(item) ==Bar:
            bar_count += 1
    return foo_count,bar_count
result = func(Foo(),Bar(),Foo())
print(result)

  3.isinstance: 检查第一个参数(对象)是否是第二个参数的实例.

class Base:
    pass
class Foo(Base):
    pass
obj1 = Foo()
print(isinstance(obj1,Foo))   #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
print(isinstance(obj1,Base))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
obj2 = Base()
print(isinstance(obj2,Foo))   #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
print(isinstance(obj2,Base))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
# 结果:True  True     False    True

给一个参数,判断对象是不是由某一个指定类?    type

type(obj) ==Foo

给一个参数,判断対象是不是由某一个指定类或其父类?    instance(obj,Foo)

二.方法和函数

  称谓:    类  ,  方法

      外  ,  函数

       对象.xxx   ==>  xxx就是方法

  类.XXX     ==>  xxx就是函数

  xxx           ==>   xxx就是函数

打印查看:

  function:   函数

  mathod:    方法

from types import MethodType,FunctionType
def check(arg):
    """
    检查arg是方法还是函数
    :param arg:
    :return:
    """
    if isinstance(arg,MethodType):
        print("arg是一个方法")
    elif isinstance(arg,FunctionType):
        print("arg是一个函数")
    else:
        print("不知道")

三.反射

v = getattr(obj,"func")  根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员.

getattr:  根据字符串的形成,去对象中找成员.

hasattr:  根据字符串的形成,去判断对象中是否有成员.

setattr:   根据字符串的形成,动态的设置一个成员(内存)

delattr:   根据字符串的形成, 动态的删除一个成员(内存)

#handler.py
f0 = 9
def f1():
    print("F1")
def f2():
    print("F2")
def f3():
    print("F3")
def f4():
    print("F4")
def f5():
    print("F5")
############################
from types import FunctionType
import handler
while True:
    print('''
     系统支持的函数有
     1.f1
     2.f2
     3.f3
     4.f4
     5.f5''')
    val = input("请输入要执行的函数:")
    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中不存在输入的属性名")

 

posted @ 2018-08-30 17:33  Montant  阅读(133)  评论(0编辑  收藏  举报