反射 方法和函数 type

1. isinstance/issubclass/type  ***

issubclass 判断xxx类是否是xxx类的子类

class Animal:
pass

class Cat(Animal):
pass

class BoSiCat(Cat):
pass
print(issubclass(Cat, Animal)) # 判断第一个参数是否是第二个参数的后代
print(issubclass(Animal, Cat))
print(issubclass(BoSiCat, Animal)) # True

type:给出xxx的数据类型 ,给出创建这个对象的类  比较精准的给出对象的类

class Foo(object):
    pass

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

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

class Animal:
pass

class Cat(Animal):
pass

class BoSiCat(Cat):
pass

a = Animal()
print(isinstance(a, Animal)) # 自己类可以判断
print(isinstance(a, Cat)) # 子类不能判断
c = BoSiCat()
print(isinstance(c, Animal)) # True 子类的对象可以当成父类的类型来看.
# isinstance判断的是对象是否是xxx家族体系的内容. 往上找

  

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

 

class Foo:
    # 实例方法: 对象.方法  方法    类名.方法  函数
    def chi(self):
        print("我是吃")

    @staticmethod # 都是函数
    def static_method():
        pass

    @classmethod # 都是方法
    def class_method(cls): # 类对象的内容
        pass
    @property # 神马都不是. 变量
    def age(self):
        return 10

  

posted @ 2018-08-30 18:02  咖啡·  阅读(554)  评论(0编辑  收藏  举报