Python基础-面向对象-反射

本文详细介绍了Python中的反射机制,包括hasattr(), getattr(), __getattr__(), __getitem__(), __getattribute__(), setattr(), __setattr__(), __setitem__(), delattr(), __delitem__()等方法的使用,并通过具体示例展示了这些方法如何帮助我们访问和修改对象的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射

指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),具有可插拔机制

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': '猫科'}

转载于:https://my.oschina.net/zhaojunhui/blog/1797285

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值