isinstance(obj,cls) 检查obj是不是类cls的对象python
class Foo(object): pass obj = Foo() isinstance(obj, Foo)
issubclass(sub, super) 检查sub类是不是super的派生类数据库
class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo)
python面向对象中的反射:经过字符串的形式操做对象相关属性。python中一切皆对象(均可以使用反射)函数
class Foo: f = '类的静态变量' def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name) obj=Foo('egon',73) #检测是否含有某属性 print(hasattr(obj,'name')) print(hasattr(obj,'say_hi')) #获取属性 n=getattr(obj,'name') print(n) func=getattr(obj,'say_hi') func() print(getattr(obj,'aaaaaaaa','不存在啊')) # 不存在 'aaaa' 属性的时候自动设置默认值‘不存在’, 不设默认值会报错 #设置属性 setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb') print(obj.__dict__) print(obj.show_name(obj)) #删除属性 delattr(obj,'age') delattr(obj,'show_name') delattr(obj,'show_name111')#不存在,则报错 print(obj.__dict__)
类也是对象,也能够反射spa
class Foo(object): staticField = "old boy" def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' @staticmethod def bar(): return 'bar' print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar')
反射的应用操作系统
class Service: def run(self): while True: inp = input('>>:').strip() # cmd = 'get a.txt' cmds = inp.split() # cmd = ['get', 'a.txt'] if hasattr(self, cmds[0]): func = getattr(self, cmds[0]) func(cmds) def get(self, cmds): print('get....') def put(self, cmds): print('put ....') obj = Service() obj.run()
class Foo: x=1 def __init__(self,y): self.y=y def __getattr__(self, item): print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value): print('----> from setattr') # self.key=value #这就无限递归了,你好好想一想 # self.__dict__[key]=value #应该使用它 def __delattr__(self, item): print('----> from delattr') # del self.item #无限递归了 self.__dict__.pop(item) #__setattr__添加/修改属性会触发它的执行 f1=Foo(10) print(f1.__dict__) # 由于你重写了__setattr__,凡是赋值操做都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操做属性字典,不然永远没法赋值 f1.z=3 print(f1.__dict__) #__delattr__删除属性的时候会触发 f1.__dict__['a']=3#咱们能够直接修改属性字典,来完成添加/修改属性的操做 del f1.a print(f1.__dict__) #__getattr__只有在使用点调用属性且属性不存在的时候才会触发 f1.xxxxxx 三者的用法演示
# item系列 # 把类和对象和交互转换成dict的形式 class Foo: #Dict def __init__(self, name): self.name = name def __getitem__(self, item): return self.__dict__.get(item) def __setitem__(self, key, value): self.__dict__[key] = value def __delitem__(self, key): del self.__dict__[key] obj = Foo('egon') # 查看属性 # print(obj['name']) # 设置属性 # obj['age'] = 18 # print(obj.age) # print(obj.__dict__) # 删除属性 del obj['name'] print(obj.__dict__)
改变对象的字符串显示__str__,__repr__code
自定制格式化字符串__format__orm
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
format_dict={
'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
}
class School:
def __init__(self,name,addr,type):
self.name=name
self.addr=addr
self.type=type对象
def __repr__(self):
return 'School(%s,%s)' %(self.name,self.addr)
def __str__(self):
return '(%s,%s)' %(self.name,self.addr)blog
def __format__(self, format_spec):
# if format_spec
if not format_spec or format_spec not in format_dict:
format_spec='nat'
fmt=format_dict[format_spec]
return fmt.format(obj=self)递归
s1=School('oldboy1','北京','私立')
print('from repr: ',repr(s1))
print('from str: ',str(s1))
print(s1)
'''
str函数或者print函数--->obj.__str__()
repr或者交互式解释器--->obj.__repr__()
若是__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,不然抛出异常
'''
print(format(s1,'nat'))
print(format(s1,'tna'))
print(format(s1,'tan'))
print(format(s1,'asfdasdffd'))
注:若是产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,若是产生的对象的同时还会向操做系统发起系统调用,即一个对象有用户级与内核级两种资源,好比(打开一个文件,建立一个数据库连接),则必须在清除对象的同时回收系统资源,这就用到了__del__
#__del__ 回收系统操做资源 # f=open('settings.py') # f.read() # f.close() #回收操做系统的资源 # print(f) # f.read() class Open: def __init__(self,filename): print('open file.......') self.filename=filename def __del__(self): print('回收操做系统资源:self.close()') f=Open('settings.py') # del f #f.__del__()