isinstance / issubclass / type, 方法和函数, 反射

一.issubclass / type / isinstance

issubclass: 检查第一个参数是否是第二个参数的子类或子类的子类

class Base(object):
    pass

class Foo(Base):
    pass

class Bar(Foo):
    pass

print(issubclass(Bar, Base))

  

type: 获取当前对象是由那个类创建

class Foo(object):
    pass

obj = Foo()

print(obj, type(obj))
if type(obj) == Foo:
    print('obj是Foo类型')

  

isinstance: 检查第一个参数(对象)是否是第二个参数(类及父类)的实例

class Base(object):
    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))

  

二.方法和函数

对象.xxx --> xxx就是方法
类.xxx --> xxx就是函数
xxx --> xxx就是函数

打印看是方法还是函数

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('不知道是什么')

  

  

三.反射

isinstance(getattr(), FunctionType)

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

应用一:

from types import FunctionType
import handler  # 同目录的py文件

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

    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中不存在输入的属性名')

  

应用二:

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
        func(self)
        # 或者
        func = getattr(self, func_name)  # self.login
        func()

  

 

posted @ 2018-08-29 21:23  NachoLau  阅读(218)  评论(0编辑  收藏  举报