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 = 12322 
23 4. delattr(object, name)
24 
25 与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar

 

posted @ 2018-09-28 21:01  qi.hu  阅读(166)  评论(0编辑  收藏  举报