1、issubclass()
检测一个类是否是另外一个类的子类
2、isinstance()
检测一个对象是否是某个类的对象
3、反射方法
python面向对象中的反射:通过字符串的形式操作对象相关的属性
1、issubclass()
检测一个类是否是另外一个类的子类
格式1:issubclass(被检测类,父类)
返回值:布尔值
格式1:issubclass(被检测类,(父类1,父类2,父类3…))
返回值:布尔值
注意:只要有一个类是当前被检测类的父类,那么最终结果就是True
class A(object):
pass
class B(A):
pass
class C(object):
pass
ret=issubclass(B,(A,C)) # A与C中,A被检测到是B的父类,将返回True
print(ret)
运行结果:
True
2、isinstance()
检测一个对象是否是某个类的对象
格式1:isinstance(对象,类)
返回值:布尔值
格式2:isinstance(对象,(类1,类2,类3…))
返回值:布尔值
注意:只要一个类是当前对象的类,那么最终结果就是True
class A(object):
pass
class B(A):
pass
class C(object):
pass
b=B()
ret=isinstance(b ,B)
print(ret) # True
ret=isinstance(b,A)
print(ret) # True
ret=isinstance(b,(A,B,C)) # 只要一个类是当前对象的类,那么最终结果就是True
print(ret) # True
运行结果:
True
True
True
3、反射方法
python面向对象中的反射:通过字符串的形式操作对象相关的属性
python中的一切事物都是对象(都可以使用反射)
四个反射相关的函数
-hasattr :判断是否有此变量,返回bool 值
-getattr : 获取属性值或者获取方法变量的地址
-setattr :给类或者对象设置属性或者方法 (用的场合很少,了解即可)
-delattr: 删除类或者对象的属性或方法(用的场合很少,了解即可)
-
反射类的属性和方法
-
反射对象的属性和方法
-
反射模块的属性和方法
class Teacher(object): dict1={'查看学生的信息':'show_student','查看讲师信息':'show_Teacher'} def __init__(self,name,age): self.name=name self.age=age # 创建类方法 @classmethod def func(cls): print('类方法') #创建 静态方法 @staticmethod def func1(): print('静态方法') def show_student(self): print('show_student...') def show_teacher(self): print('show_teacher') # 获取静态方法和类方法 # 判断类中是否有dict1静态属性 b=hasattr(Teacher,'dict1') print(b) # True #获取属性dict1的值 dict1 = getattr(Teacher, 'dict1') print(dict1) # {'查看学生的信息':'show_student','查看讲师信息':'show_Teacher'} key = input('>>>') teacher = Teacher('zs', 10) ret=dict1.get(key,'') if ret: func = getattr(teacher, ret) #获取方法变量地址 func() else: print('不存在...')
运行结果:
True
{'a': 'show_student', 'b': 'show_Teacher'}
>>>a
show_student...
1.给A类添加静态age属性
class A(object):
pass
setattr(A,'age',10)
print(A.age) # 10
#2.给A类的对象添加name属性
a=A()
setattr(A,'name','zs')
print(A.name) # zs
# 删除a对象中的age属性
a=A()
setattr(A,'name','zs') #添加name属性
delattr(a,'name') # 删除name属性
print(a.name) # 报错
# 反射自己的属性
name = 'zs'
def func():
print('zzz')
import sys
#print(sys.modules) # 记录当前内存中已经被加载的模块
print(sys.modules['__main__'])
n=getattr(sys.modules['__main__'],'name')
print(n)
运行结果:
<module '__main__' from 'E:/homework/pythonworksplace/day17-面向对象/demon09-反射.py'>
zs
# 反射内置模块
import time
t=getattr(time,'time') # 反射时间戳
print(t())
运行结果:
1547652615.4991376