1.isinstance判断对象的所属类型包括继承
例:
class A:pass class B(A):pass b = B() print(isinstance(b,B)) ==>True print(isinstance(b,A)) ==>True
例:
class My(str):pass me = My("小白") print(type(me) is str) ==>False #不包含继承,只管一层 print(isinstance("小白",str)) ==>True #包含所有的继承关系 issubclass判断两个类的关系
例:
class A:pass class B(A):pass print(issubclass(B,A)) ==>True print(issubclass(A,B)) ==>False
2.反射 用字符串数据类型的变量来访问这个变量的值 (getattr,hasattr,setattr,delattr)
类:语法:getattr(类名,"变量/方法名") 命名空间.变量/方法名 <==> getattr(命名空间,"变量/方法名")
(1)反射查看静态属性
例:
class Student: ROLE = "student" print(getattr(Student,"ROLE")) ==>student #第一个参数的命名空间中的变量名为第二个参数的变量的值
(2)反射调用方法
例:
class Student: @classmethod def check_course(cls): print("查看课程") @staticmethod def login(): print("登录成功") getattr(Student,"check_course")() ==>查看课程 #类方法 getattr(Student,"login")() ==>登陆成功 #静态方法 num = input(">>>>") ==> >>>>login if hasattr(Student,num): 登录成功 getattr(Student,num)()
对象:语法:getattr(对象,"方法名")
例:
class Student: def __init__(self,name): self.name = name def func(self): print("in func") s = Student("小白") getattr(s,"func")() ==>in func
模块:语法:getattr(模块名,"模块内部的方法名")
例:
import os #别人写好的python代码结合 getattr(os,"rename")("a","a.txt") <==> os.rename("a","a.txt") #将名为a的文件改命名为a.txt
自己模块中的内容:
例:
import sys #导入一个模块,sys模块,这个模块里的所有的方法都是和python解释器相关的 def wahaha(): print("wahaha") def qqxing(): print("qqxing") print(sys.modules["__main__"]) #sys.mudules这个方法表示所有在当前这个python程序中导入的模块 file = sys.modules["__main__"] getattr(file,"wahaha")() 结果:<module '__main__' from 'F:/面向对象/18.07.30/课堂练习.py'> wahaha
setattr(对象,属性名,新值) 修改属性值
delattr(对象,"属性名") 删除属性
例:
class A: def __init__(self,name): self.name = name a = A("小白") setattr(a,"name","小白1") print(a.name) ==>小白1 delattr(a,"name") print(a.__dict__) ==>{}
3.__名字__ (双下方法,魔术方法,类中的特殊方法,内置方法)
类中的每一个双下方法都有自己的特殊意义
(1)__call__ 对象() <==> 类名()()
例:
class A: def __call__(self, *args, **kwargs): print("in call") a = A() <==> A()() a() ==>in call #调用__call__方法
例:
class A: def __call__(self, *args, **kwargs): print("in call") class B: def __init__(self,cls): self.a = cls() #实例化A类 self.a是A的对象 self.a() B(A) ==>in call
(2)__len__ len(obj)相当于调用这个对象的__len__方法
例:
class My: def __init__(self): self.lst = [1,2,3,4,5] self.name = "小白" def __len__(self): return len(self.lst) l = My() print(len(l)) ==>5
例:
class My: def __init__(self): self.lst = [1,2,3,4,5] self.name = "小白" def __len__(self): return len(self.__dict__) #return的值就是len函数的返回值 l = My() print(len(l)) ==>2
如果一个函数没有__len__方法那么len函数会报错
(3)__new__是构造函数
在实例化之后,执行__init__函数之前,先执行__new__函数来创建一块空间
例:
class Single: def __new__(cls, *args, **kwargs): obj = object.__new__(cls) return obj def __init__(self): print("在 init") a = Single() ==>在 init
例:单例类
class Single: __ISINSTANCE = None def __new__(cls, *args, **kwargs): if not cls.__ISINSTANCE: #第一次实例化之后if判断为True 之后再实例化if判断都为False cls.__ISINSTANCE = object.__new__(cls) return cls.__ISINSTANCE def __init__(self,name,age): #self = cls.__ISINSTANCE self.name = name self.age = age s1 = Single("小黑",18) s2 = Single("小白",20) print(s1,s2) ==><__main__.Single object at 0x0000018A9E1E00B8> <__main__.Single object at 0x0000018A9E1FF908>
(4)__str__
例:
class Student: def __str__(self): return "%s %s %s" % (self.name,self.sex,self.age) def __init__(self,name,sex,age): self.name = name self.sex = sex self.age = age s = Student("小白","男",20) print(s) ==>小白 男 20 #print一个对象相当于调用一个对象的__str__方法 print(str(s)) ==>小白 男 20 #str(obj)相当于执行__str__方法 print("学生:%s" % s) ==>学生:小白 男 20 #"%s" % obj 相当于执行obj.__str__方法
所有的双下方法,没有需要我们在外部直接调用的 总有一些其他的内置函数特殊方法来自动触发这些双下方法