19_python_反射
一、内置函数(补充)
1、issubclass() -- 方法用于判断参数 class 是否是类型参数 classinfo 的子类。
语法格式:issubclass(class, classinfo)
class -- 类 classinfo -- 类 如果 class 是 classinfo 的子类返回 True,否则返回 False
1 class A: 2 pass 3 class B(A): 4 pass 5 print(issubclass(B,A)) # 返回 True
2、isinstance() -- 函数来判断一个对象是否是一个已知的类型,类似 type()
(1) isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
语法格式:isinstance(object, classinfo)
object -- 实例对象
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
1 >>>a = 2 2 >>> isinstance (a,int) True 3 >>> isinstance (a,str) False 4 >>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True True
1 class A: 2 pass 3 class B(A): 4 pass 5 isinstance(A(), A) # returns True 6 type(A()) == A # returns True 7 isinstance(B(), A) # returns True 8 type(B()) == A # returns False
1 class Animal: 2 pass 3 4 class Cat(Animal): 5 pass 6 7 class BoSiCat(Cat): 8 pass 9 10 a = Animal() 11 print(isinstance(a, Animal)) # 自己类可以判断 12 print(isinstance(a, Cat)) # 子类不能判断 13 14 15 16 c = BoSiCat() 17 print(isinstance(c, Animal)) # True 子类的对象可以当成父类的类型来看. 18 # isinstance判断的是对象是否是xxx家族体系的内容. 往上找
3、type
1 class Animal: 2 pass 3 4 class Cat(Animal): 5 pass 6 7 class BoSiCat(Cat): 8 pass 9 10 c = Cat() 11 print(type(c)) # 比较精准的给出对象的类 <class '__main__.Cat'> 12 13 计算a+b的结果并返回. 两个数相加 14 def add(a, b): 15 if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float): 16 return a + b 17 else: 18 print("算不了") 19 print(add("胡汉三", 2.5))
二、判断方法还是函数
1. 类方法. 不论任何情况, 都是方法.
2. 静态方法, 不论任何情况. 都是函数
3. 实例例方法, 如果是实例访问. 就是方法. 如果是类名访问就是函数.
1 # 引入两个模块 2 from types import FunctionType, MethodType 3 4 def haha(arg): 5 print(isinstance(arg, FunctionType)) # False 6 print(isinstance(arg, MethodType)) # True 7 haha(Foo.age)
三、反射
1、getattr( )、hasattr()
1 import master 2 from types import FunctionType 3 while 1: 4 print("""作为, 我帮你写了: 5 chi 6 he 7 la 8 shui 9 等功能. 看看吧""") 10 gn = input("请输你要测试的功能:") 11 # niuB版 12 if hasattr(master, gn): # 如果master有你要的功能 13 14 attr = getattr(master, gn) # 获取这个功能, 并执 15 if isinstance(attr, FunctionType): # 判断是否是函数. 只有函数才可以被调 16 attr() 17 else: # 如果不是函数, 就打印 18 print(attr)
getattr()来获取信息. hasattr()来判断xxx中是否包含了xxx功能, 那么我们可以在模块中这样来使反射
1 class Person: 2 country = "清" 3 def chi(self): 4 pass 5 # 类中的内容可以这样动态的进获取 6 print(getattr(Person, "country")) 7 print(getattr(Person, "chi")) # 相当于Foo.func 函数 8 # 对象样可以 9 obj = Person() 10 print(getattr(obj, "country")) # 11 print(getattr(obj, "chi")) # 相当于obj.func 法 12 13 结果: 14 清 15 <function Person.chi at 0x02CB5150> 16 清 17 <bound method Person.chi of <__main__.Person object at 0x01055870>>
2、其他方法 setattr、delattr
(1) setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这的value可以是值, 也可以是函数或者方法
(2) delattr(obj, str) 把obj中的str成员删除掉
1 #设置成员 2 print(obj.name) #设置之前为:abc 3 ret = setattr(obj,'name',19) 4 print(obj.name) #设置之后为:19 5 #删除成员 6 print(obj.name) #abc 7 delattr(obj,'name') 8 print(obj.name) #报错
小节:1.根据字符串的形式导入模块。2.根据字符串的形式去对象(某个模块)中操作其成员, 反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动
1 1. getattr()函数是Python自省的核心函数,具体使用大体如下: 2 class A: 3 def __init__(self): 4 self.name = 'zhangjing' 5 #self.age='24' 6 def method(self): 7 print"method print" 8 9 Instance = A() 10 print getattr(Instance , 'name, 'not find') #如果Instance 对象中有属性name则打印self.name的值,否则打印'not find' 11 print getattr(Instance , 'age', 'not find') #如果Instance 对象中有属性age则打印self.age的值,否则打印'not find' 12 print getattr(a, 'method', 'default') #如果有方法method,否则打印其地址,否则打印default 13 print getattr(a, 'method', 'default')() #如果有方法method,运行函数并打印None否则打印default 14 15 2. hasattr(object, name) 16 17 说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的) 18 19 3. setattr(object, name, value) 20 21 这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。 22 23 4. delattr(object, name) 24 25 与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar