反射

isinstance:能够检测到继承关系 判断一个对象和一个类有没有血缘关系

 1   class A():
 2       def __init__(self,name):
 3           self.name = name
 4  5       def print(self):
 6           print("%s是只猫" %self.name)
 7   class B(A):
 8       def hello(self):
 9           print("in B")
10   a = A("pp")
11   a.print()
12   print(isinstance(a,A)) 
13   #isinstance(对象名,类名)

 

isdubclass:issubclass(子类名,父类名)如果返回True说明有继承关系,用来判断类与类之间的关系

 1   class A():
 2       def __init__(self,name):
 3           self.name = name
 4  5       def print(self):
 6           print("%s是只猫" %self.name)
 7   class B(A):
 8       def hello(self):
 9           print("in B")
10   a = A("pp")
11   a.print()
12   print(issubclass(B,A))  #True
13   print(issubclass(A,B))  #False
14 15   #多继承也是可以的
16   class C():pass
17 18   class A(C):
19       def __init__(self,name):
20           self.name = name
21 22       def print(self):
23           print("%s是只猫" %self.name)
24   class B(A):
25       def hello(self):
26           print("in B")
27   a = A("pp")
28   a.print()
29   print(issubclass(B,C))   #True

getattr:反射,使用字符串数据类型的变量名,访问一个命名空间中的名字 正常情况下如果拿到这个变量,那么如果有这个变量的字符串形式,就可以使用反射获取到这个值 找一个属性,直接就可以找到这个属性的值 找一个方法,找到的是这个方法的内存地址

类中的反射:类可以获取类中的属性和方法

  
1   class A():
2       def func(self):
3           print("in func")
4 5   r = getattr(A,"func");r(1)
6   r = getattr(A,"func")(1)

 

hasattr:判断一个命名空间中是否有这个变量名,如果有则返回True,否则返回False

使用类命名空间中的名字 getattr(类名,"名字")

  
1 class A():
2       def func(self):
3           print("in func")
4   r = getattr(A,"func")(1)

 

对象使用对象能用的方法和属性 getattr(模块名,"名字")

1   
2   class A():
3       def func(self):
4           print("in func")
5   a = A()
6   r = getattr(a,"func")()

 

模块使用模块中的名字 导入模块 getattr(模块名,"名字")

  
import os
getter(os,'rename'('user','user_info')

从自己所在的模块中使用自己名字 import sys getattr(sys.modules['__main__'],'名字')

 1   
 2   import sys
 3   def func1():
 4       print("in func")
 5   def dunc2():
 6       print("in func2")
 7   func = input(">>>")
 8   getattr(sys.modules["__main__"],func)()
 9   
10   if hasattr(sys.modules["__main__"],func): #用来判断是否有这个函数可以被调用
11       getattr(sys.modules["__main__"],func)()

 

 

getattr一定要和hasattr配合使用

setattr:设置属性

 1 class A():
 2      def func(self):
 3           print("in func")
 4  5 a = A()
 6 setattr(a,"age",18)  #没有就添加这个属性
 7 print(A.__dict__)
 8  print(a.age)
 9 setattr(a,"age",22)   #如果有这个属性就更改这个属性的值
10 print(a.age)

 

 

delattr:删除属性

 1   class A():
 2       def func(self):
 3           print("in func")
 4  5   a = A()
 6   setattr(a,"age",18)
 7   print(A.__dict__)
 8   print(a.age)
 9   setattr(a,"age",22)
10   print(a.age)
11   delattr(a,"age")  #有就删除,没有则报错

 


 

posted @ 2018-04-18 16:21  kuoiea  阅读(216)  评论(0)    收藏  举报