反射 方法和函数 type

1. isinstance/issubclass/type  ***

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

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

  

2. 用科学的方法判断是方法和函数   *

称谓:
#   类,方法
#   外,函数
# 到底方法函数?
#   对象.xxx  --> xxx就是方法
#   类.xxx    --> xxx就是函数
#   xxx       --> xxx就是函数
# 打印查看:
# function
# method


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

  

3. 反射   *****

    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中不存在输入的属性名')
getattr
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()
实例2
好记:
getattr # 根据字符串的形式,去对象中找成员。*****
hasattr # 根据字符串的形式,去判断对象中是否有成员。***
setattr # 根据字符串的形式,动态的设置一个成员(内存)
delattr # 根据字符串的形式,动态的删除一个成员(内存)


总结:

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

问题:你见过的什么后面可以加()?
- 类()
- 对象()
- 函数()
- 方法()
以上所有都可以被调用。

示例:
		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))
			

猜你喜欢

转载自www.cnblogs.com/xihuanniya/p/9561761.html
今日推荐