一、isinstance和issubclass
isinstance:判断一个对象是不是一个类的实例
class Foo() pass obj=Foo() print(isinstance(obj,Foo)) #True #推荐使用该函数来判断一个函数的类型 print(isinstance('abc',str)) #True #判断‘abc’是否是字符串类型
issubclass:判断Foo是不是object的子类
class Foo: pass print(issubclass(Foo,object)) #True
二、反射:
通过字符串来操作类与对象的属性,这种操作称为反射
下述四个函数是专门用来操作类与对象属性的
class People: country='China' def __init__(self,name): self.name=name def tell(self): print('%s is aaa'%self.name) obj=People('gao') 1.hasattr #判断类是否有属性操作 print(hasattr(People,'country')) #True print('country' in People.__dict__) #True print(hasattr(obj,'name') #True 2.getattr #拿到类的属性 f=getattr(obj,'tell',None) print(f==obj.tell) #True f() #gao is aaa obj.tell() #gao is aaa 3.setattr: #设置类的属性 People.x=111 setattr(People,'x',111) print(People.x) #111 4.delattr: #删除类的属性 def obj.name delattr(obj,'name') print(obj.__dict__)
三、__str__方法:如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值
class People: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def __str__(self): return'<名字:%s 年龄:%s 性别:%s>' %(self.name,self.age,self.sex) obj=People('gao',18,'male') print(obj) #<名字:egon 年龄:18 性别:male>
四、__del__方法:析构方法,当对象在内存中被释放时,自动触发执行。
析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。就是要回收系统资源。
class Foo: def __del__(self): pass
五、元类:类的类就是元类
exec:三个参数
参数一:字符串形式的命令
参数二:全局作用域(字典形式),如果不指定,默认为globals()
参数三:局部作用域(字典形式),如果不指定,默认为locals()
1.我们用class定义的类使用来产生我们自己的对象的
内置元类type是用来专门产生class定义的类的
class Foo: pass print(type(Foo)) #<class 'type'>
2.用内置的元类type,来实例化得到我们的类
类的三大要素
print(class_name,class_bases,class_dic) #类名、基类、类的名称空间
3.__call__方法:调用对象,则会自动触发对象下的绑定方法__call__的执行,然后将对象本身当作第一个参数传给self,将调用对象时括号内的值传给*args,**kwargs
class Foo: def __init__(self): pass def __str__(self): return '1233213' def __del__(self): pass def __call__(self,*args,**kwargs): print('__call__',args,kwargs) obj=Foo() print(obj) #__call__ (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}
4.自定义元类:
控制类Foo的调用过程,即控制实例化Foo的过程
1.造一个空对象obj
2.调用Foo.__init__,将obj连同调用Foo括号内的参数一同传给__init__
5.单例模式:
在内存中存的值一模一样的情况下,节省空间