1、isinstance() 判断对象所属类型,包括继承关系
2、issubclass() 判断类与类之间的继承关系
class A:pass
class B(A): pass
print(isinstance(b,B)) # o,t
print(isinstance(b,A)) # o,t
class mystr(str): pass
ms = mystr("alex")
print(type(ms) is str) # 不包含继承关系,只管一层
print(isinstance("alex",str)) # 包含所有的继承关系
class A: pass
class B(A) : pass
print(issubclass(B,A))
print(issubclass(A,B))
3、反射
用字符串数据类型的变量名来访问这个变量的值
反射的方法:getattar,用于返回一个对象属性值 (类、静态属性、类方法、静态方法)命名空间.XXX == getattr(命名空间,“XXX”)
hasattr,函数用于判断是否包含对应的属性
setattr,用于设置属性值,该属性必须存在
delattr,函数用于删除属性
getattr(os,"rename")("init","__init__.py") # == os.rename
反射自己模块中的内容, 找到自己当前文件所在的命名空间
def a():
print("A")
def b():
print("B")
import sys # 是一个模块,这个模块里的所有的方法都是和Python解释器相关的
# import 相当于导入了一个模块
sys.modules # 这个方法,表示所有在当前这个Python程序中导入的模块
my_file = sys.modules["__main__"]
getattr(my_file,"a")()
getattr(my_file,"b")()
反射
类名.名字
getattr(类名,“名字”)
对象名.名字
getattr(对象名,“名字”)
模块名.名字
import 模块
getattr(模块,“名字”)
自己文件.名字
import sys
getattr(sys.modules["__main__"],"名字')
4、__名字__ # 例如:__init__ 初始化方法
类中的特殊方法、内置方法
双下方法
魔术方法
类中的每个双下方法都有它自己的特殊意义
__call__ 相当于 对象()
__len__ len(obj)
__new__ 特别重要 开辟内存空间的,类的构造方法 # 写一个单例类
__str__ , str(obj) , "%s" % obj , print(obj)
所有的双下方法, 没有 需要你在外部直接调用的 而是总有一些其他的,内置函数,特殊的语法来自动触发这些双下方法
__new__ # 构造方法
__init__ # 初识方法
class Single:
def __new__(cls, *args, **kwargs):
print("在new方法里")
obj = object.__new__(cls)
print("在new方法里",obj)
return obj
def __init__(self):
print("在init方法里",self)
obj = Single()
single的new,single没有,只能调用object的new方法
new方法在什么时候执行??
在实例化之后,__init__之前先执行new来创建一块空间
5、单例
如果一个类,从到尾只能有一个实例,说明从头到尾之开辟了一块属于对象的空间, 那么这个类就是一个单例类
单例类
class Single:
__ISINSTANCE = None
def __new__(cls,*args,**kwargs):
if not cls.__ISINSTANCE:
cls.__ISINSTANCE = object.__new__(cls)
return cls.__ISINSTANCE
def __init__(self,name,age):
self.name = name
self.age = age
s1 = Single("guo", 22)
s2 = Single("wang",24)
print(s1.name)
print(s2.name)
print(s1,s2)
6、__str__
class Student:
def __str__(self):
return "%s %s %s" % (self.school,self.cls,self.name)
def __init__(self,name,stu_cls):
self.school = "huifeng"
self.name = name
self.cls = stu_cls
stu = Student("guoxuxu","highschool")
print(stu)
print(str(stu)) # 内置的数据类型,内置的类,相当于执行__str__
print("学生:%s" % stu)
print 一个对象相当于调用一个对象的__str__方法
str(obj) 相当于执行obj.__str__方法
"%s" % obj 相当于执行obj.__str__方法