type()、获取对象信息
1.判断对象类型 type()
type(obj)返回对线类型如: type(1) #<class 'int'> type('a') #<class 'str'> func(): return ('this is a function') type(func) #<class 'function'>
2.和 isinstance()区别
class Father(): pass class Child(Father): pass isinstance(Child(),Father)#子类也是父类的实例 返回True type(Child())==Father # 子类不属于父类类型 返回False
3.type的另外一个作用,动态生成类
class A(): def say(): return ('function say') type(A())#<class '__main__.A'> type(A)#<class 'type'>
我们发现type(A)输出的是type类型,python动态语言中的类是在运行时候创建的,而创建class的方法就是type()方法
python中类创建的本质:
我们使用class创建类,当你使用class关键字时,Python解释器自动创建这个对象。而底层其实使用的是type函数(type函数也可以查看实例所属类型)来创建类的。所以我们可以直接使用type()函数来手动实现动态创建类。
type()创建类的语法为:
类名 = type('字符串类型,同类名',(继承关系,元祖类型),{字典类型,放类的方法 和类属性})
举例说明:
class Person(): def per(self): return('这是Person类中的per方法') class Test_obj(): def func1(self): return('另外的一个func1函数') # Student=type('Student',(Person,),dict(say=Test_obj().func1)) Student=type('Student',(Person,),{'say':Test_obj().func1,'name':'jack'}) stu=Student() print(stu.per())#这是Person类中的per方法 print(stu.say())#另外的一个func1函数 print(stu.name)#jack
这个动态生成的类等同于:
class Student(Person): name = 'jack' def say(self): return('另外的一个func1函数')
4.hasattr getattr setattr
其实我们也不用像上述代码那样子 一个一个打印出来来验证申明的类中是否有这些属性.
查看是否含有某个属性,可以用 hasattr(obj,attr)
接上述代码:
hasattr(Student,'per') #True hasattr(Student,'name')#True hasattr(Student,'say')#True
当传一个没有的属性时,返回False
hasattr(Student,'score')#False
获取某个属性,可以用getattr(obj,attr)
getattr(Student,'name') #jack getattr(Student,'per')#<function Person.per at 0x000001FE7208D948> 返回这个函数
当试图获取一个没有的属性的时候,报错
getattr(Student,'score')#报错没有属性score
当然我们一般都是直接去obj.attr 去获取属性,没必要去getattr,hasattr但是当我们不知道对象信息的时候,getattr就起作用了,如:
def readImage(fp): if hasattr(fp, 'read'): return readData(fp) return None
假设我们希望从文件流 fp 中读取图像,我们首先要判断该 fp 对象是否存在 read 方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。根据鸭子类型,有 read()方法,不代表该 fp 对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要 read()方法返回的是有效的图像数据,就不影响读取图像的功能。
当然我们也可以去setattr手动给某个类添加属性 :setattr(objname,attrname,attr)
还是接上述动态生成的Student类 如:
setattr(Student,'score',100) hasattr(Student,'score') #True def func2(self): return ('func2') setattr(Student,'func2',func2) Student().func2() #返回func2
当setattr一个属性和之前本来就存在的属性同名的时候,直接覆盖原来的属性