一、isinstance()和issubclass()
class Foo:
pass
class Son(Foo):
pass
f = Foo()
# 判断对象是不是类的对象
print(isinstance(f,Foo)) # isinstance(f,Foo)需要两个参数,第一个是要坚持的对象,第二个是对象属于的类。是返回True,不是返回False
# 判断两个类是不是派生类
print(issubclass(Son,Foo)) # issubclass()需要传两个参数,第一个是要坚持的对象,第二个是父类。是则返回True,不是返回False
二、反射
反射:主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)
class Foo:
pass
class Son(Foo):
pass
f = Foo()
# 判断对象是不是类的对象
print(isinstance(f,Foo)) # isinstance(f,Foo)需要两个参数,第一个是要坚持的对象,第二个是对象属于的类。是返回True,不是返回False
# 判断两个类是不是派生类
print(issubclass(Son,Foo)) # issubclass()需要传两个参数,第一个是要坚持的对象,第二个是父类。是则返回True,不是返回False
# 反射:通过字符串来映射对象的属性,即通过字符串的输入来执行相应功能的代码 eval()
class People:
def __init__(self,name,age):
self.name = name
self.age = age
def talk(self):
print('name:%s age:%s'%(self.name,self.age))
@staticmethod
def trys():
return 'trys'
p = People('夏天',25)
# 判断对象面是否有相应的属性,hasattr(obj,str)有两个参数,obj是要判断的对象,str必须是字符串类型的变量,代表obj对象里面有无str的变量
print(hasattr(p,'name')) # 实际上是在判断p.__dict__['name']字典里面有没有name的变量
print(hasattr(p,'talk')) # 判断p里面有没有talk的函数属性
# 获取属性的值
# getattr(obj,str,default) 有三个参数,最后一个参数可以不填,str中的参数必须是字符串
n = getattr(p,'name') # 实际上是获取p.name的值
print(n)
b = getattr(p,'name456','数据出错') # 填了第三个参数,如果出错则会打印定义好的错误信息
print(b)
fun = getattr(p,'talk')
fun()
print(getattr(People,'trys')) # 反射类
# 修改对象参数
# setattr(obj,str,val)里面有三个参数,第二个参数是要修改对象的属性参数,第三个是修改后的值
a = setattr(p,'name','big') # 实际上是与p.name='big'等效
print(p.name)
setattr(People,'country','china')
print(getattr(p,'country'))
# 删除属性
delattr(p,'name')
print(p.__dict__)
# 反射当前模块成员
import sys
def s1():
print('s1')
def s2():
print('s2')
this_module = sys.modules[__name__]
a = hasattr(this_module, 's1')
b = getattr(this_module, 's2')
print(a)
b()
使用例子:
# 使用例子
class Service:
def run(self):
while True:
inp = input('>>:').strip()
cmd = inp.split()
if hasattr(self,cmd[0]):
func = getattr(self,cmd[0])
func(cmd[1])
def get(self,cmd):
print('get.....',cmd)
def put(self,cmd):
print('put.....',cmd)
obj = Service()
obj.run()
三、getitem,setitem,delitem:
此系列相当于将对象或者类的属性名称和对应的值对应起来,形成像字典的结构{‘item’:value}
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
print('from func')
def __getitem__(self, item):
print('getattr><')
return self.__dict__[item] # 当输入的不是字典中的key时会报错
# return self.__dict__.get(item) # 当输入的不是字典中的key时不会报错
def __setitem__(self, key, value):
print('setattr><')
print(key,value)
self.__dict__[key]= value
def __delitem__(self, key):
print('delitem><')
# del self.__dict__[key]
self.__dict__.pop(key)
f = Foo('夏天',25)
print(f.__dict__)
# print(f['age'])
f['name'] = 'tiantian'
print(f.name)
del f['name']
print(f.__dict__)
四、str
打印对象时可以定制需要打印对象的那些信息,而不是打印出来一个对象
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self): # 会在打印对象时触发此方法
print('str><')
return 'name:%s age:%s'%(self.name,self.age) # __str__方法必须要有返回值,返回值必须是字符串
f = Foo('夏天',18)
print(f) # 打印对象是直接打印定制化的输出
五、del
python在程序运行完成后会自动回收程序内定义的名称空间资源,不会回收申请的操作系统资源,要回收操作系统资源则需要给操作系统发指令,如文件操作中的f.close()就是给操作系统信号。
在类中可以用__del__来回收回收和对象相关连的资源,如:申请的操作系统资源
class Open:
def __init__(self,filename):
print('open file...')
self.filename = filename
def __del__(self): # 在不调用此方法时,在程序结束后会自动触发,回收与对象相关的资源。
print('回收资源....') # 相当于文件操作中的f.clos()
f = Open('setting.py')
del f
print('---finish----')
输出结果:
open file...
回收资源....
---finish----