反射
指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),具有可插拔机制
hasattr()
用于判断对象是否包含对应的属性
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(hasattr(P,"Name")) #属性判断
老虎是猫科动物
True
getattr()
用于返回一个对象默认属性值
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(getattr(P,"Name")) #对象返回值
print(getattr(P,"Test","没有这个属性")) #定义默认值,没有则返回默认值
老虎是猫科动物
True
老虎
没有这个属性
__getattr__()
用于返回一个方法默认属性值,需要用类方法访问
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
def __getattr__(self, item): #定义方法默认值,没有则返回默认值
print("没有【%s】这个方法!!!"%item)
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(getattr(P,"Name")) #对象返回值
P.test #调用不存在的方法测试
老虎是猫科动物
老虎
没有【test】这个方法!!!
__getitem__()
用于返回一个方法默认属性值,需要字典方式访问
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
def __getitem__(self, item): #定义方法默认值,没有则返回默认值
print("没有【%s】这个方法!!!"%item)
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(getattr(P,"Name")) #对象返回值
P['test'] #调用不存在的方法测试
老虎是猫科动物
老虎
没有【test】这个方法!!!
__getattribute__()
用于返回一个方法默认属性值(无论存在不存在)
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
def __getattribute__(self, item): #定义方法默认值,没有则返回默认值
print("无论【%s】有没有都执行!!!"%item)
P = Animal("猫科","老虎") #实例化
P.dynamic #调用存在的方法测试
P.test #调用不存在的方法测试
无论【dynamic】有没有都执行!!!
无论【test】有没有都执行!!!
setattr()
用于设置属性值,新增和修改
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(P.__dict__) #查看设置前属性字典
setattr(P,"mood","愤怒") #设置新增属性值
setattr(P,"Name","狸猫") #设置修改属性值
print(P.__dict__) #查看设置后属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
{'Species': '猫科', 'Name': '狸猫', 'mood': '愤怒'}
__setattr__()
用于设置属性值,新增和修改,用类属性方式新增和修改才能触发类方法
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
def __setattr__(self, key, value): #定义新增修改属性函数
self.__dict__[key] = value #底层实现方式,表示修改底层字典
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(P.__dict__) #查看设置前属性字典
P.mood = "愤怒" #设置新增属性值
P.Name = "狸猫" #设置修改属性值
print(P.__dict__) #查看设置前属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
{'Species': '猫科', 'Name': '狸猫', 'mood': '愤怒'}
__setitem__()
用于设置属性值,新增和修改。用字典形式新增和修改才能触发类方法
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
def __setitem__(self, key, value): #定义新增修改属性函数
self.__dict__[key] = value #底层实现方式,表示修改底层字典
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(P.__dict__) #查看设置前属性字典
P['Mood'] = "愤怒" #字典形式新增属性值
P['Name'] = "狸猫" #字典形式修改属性值
print(P.__dict__) #查看设置前属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
{'Species': '猫科', 'Name': '狸猫', 'Mood': '愤怒'}
delattr()
用于用类方法删除属性
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
def __delattr__(self, item):
print("删除数据")
self.__dict__.pop(item)
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(P.__dict__) #查看删除前属性字典
del P.Name #删除属性
print(P.__dict__) #查看删除后属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
删除数据
{'Species': '猫科'}
__delitem__()
用于以字典形式删除属性
# -*- coding:utf8 -*-
class Animal: #定义类
def __init__(self,species,name): #定义属性
self.Species = species
self.Name = name
def dynamic(self): #定义方法
print("%s是%s动物" %(self.Name,self.Species))
def __delitem__(self, key): #定义删除方法
print("删除数据")
self.__dict__.pop(key)
P = Animal("猫科","老虎") #实例化
P.dynamic() #实例化输出
print(P.__dict__) #查看删除前属性字典
del P['Name'] #删除属性
print(P.__dict__) #查看删除后属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
删除数据
{'Species': '猫科'}