isinstance/issubclass/type 方法和函数 反射 ps:补充一点小知识

一丶 issubclass   /  type   /  isinstance 

1.issubclass

检查第一个参数是否是第二个参数的 子子孙孙类

class Base(object):
    pass

class Foo(Base):
    pass
class Bar(Foo):
    pass

print(issubclass(Bar,Base))

2.type

获取当前对象时由哪一个类创建

class Foo(object):
    pass

obj = Foo()

print(obj,type(obj)) # 获取当前对象是由那个类创建。
    if type(obj) == Foo:
            print('obj是Foo类型')
    
      

3.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)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

 

二丶方法和函数

代码检测是方法还是函数,方法还是函数取决于调用方

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

 

三丶反射

含义用法:

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

应用一
from types import FunctionType
import handler

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

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

 应用二 

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()

obj1 = Account()
obj1.run()

obj2 = Account()
obj2.run()

 

ps: 补充

callable判断后面括号的内容是不是可以被调用的

def func():
    pass


class Foo(object):
    def __call__(self, *args, **kwargs):
        pass

    def func(self):
        pass


obj = Foo()

print(callable(func))
print(callable(Foo))
print(callable(obj))
print(callable(obj.func))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2018-08-30 17:43  心跳+  阅读(263)  评论(3编辑  收藏  举报
-->