isinsetance()判断对象所属类型,包括,继承关系
class A: pass class B(A): pass b = B() print(isinstance(b,A)) #包括继承关系
print(type(b) is A) #不包括继承关系
结果:True
结果:Flase
issubclass() 判断类与类之间的关系
class A: pass class B(A): pass b = B() print(issubclass(B,A)) #子级放在父级前面 结果:True
二.反射: 用字符串类型的变量名来访问这个变量的值
反射的方法:getattr,hasattr,setattr,delattr
命名空间 XXX == getattr(命名空间,'XXX')
(1):类 静态属性,类方法,静态方法
class Student: ROLE = 'STUDENT' @classmethod def check_course(cls): print('查看课程') @staticmethod def login() print('登录') #反射查看属性 print(Student.ROLE) print(getattr(Student,'ROLE')) #反射调用方法 getattr(Student,'check_course)() #类方法 getattr(Student,'login')() #静态方法
hasattr 和 getattr 配合使用
num = input('>>>') if hasattr(Student,num): #判断输入的内容类中是否有,没有返回Flase,有返回True getattr(Student,num)()
(2). 对象 :方法,对象属性
class A(): def __init__(self,name): self.name = name def func(self): print('in func') a =A('alex') print(a.name) print(getattr(a,'name')) getattr(a,'func')()
(3) 模块
import 模块 getattr (模块,'名字')
(4)自己文件
import sys getattr (sys.modules['__main__'],'名字')
三.内置方法:
__名字__ 类中的特殊方法内置方法双下方法魔术方法
类中的每一个双下方法都有它自己的特殊意义,没有需要从外部直接调用的,而是
总有一些其他的 内置函数 特殊的语法 用来触发这些双下方法
(1)__call__
class A: def __call__(self,*args,**kwargs) print('执行call方法') def call(self) peint('执行call方法') a = A() a() #对象() 相当于调用__call__方法 A()() 相当于实例化得到一个对象,在对对象() 和上面的方法一样 class B: def __init__(self,cls): print('在实例化A之前做一些事情') self.a = cls() self.a() print('在实例化之后做一些事情') B(A)
(2)__len__
class My: def__init__(self,s) self.s = s def __len__(self) return len(self.s) my = my('abc') print(len(my))
(3)__new__
单例模式:
如果一个类 从头到尾只能有一个实例,说明从头到尾之开辟了一块儿属于对象的空间,那么这个类就是一个单例类
lass Single: __ISINCTANCE = None def __new__(cls, *args, **kwargs): if not cls.__ISINCTANCE: cls.__ISINCTANCE = object.__new__(cls) return cls.__ISINCTANCE def __init__(self,name,age): self.name = name self.age = age
(4)__str__
class Student: def __str__(self): return '%s %s %s'%(self.school,self.cls,self.name) def __init__(self,name,stu_cls): self.school = 'oldboy' self.name = name self.cls = stu_cls he = Student('hezewei','py14') print(he) huang = Student('huangdongyang','py14') print(huang) print(str(he)) # 内置的数据类型,内置的类,相当于执行__str__ print('学生1 : %s'%he)