面向对象之反射

反射的四个相关方法:

复制代码
 1  1 #Author : Kelvin
 2  2 #Date : 2019/1/17 20:15
 3  3 
 4  4 # hasattr  setattr  getattr  delattr
 5  5 class People:
 6  6     def __init__(self,name,addr):
 7  7         self.name=name
 8  8         self.addr=addr
 9  9     def eat(self):
10 10         print("%s 在吃饭..."%self.name)
11 11     def run(self):
12 12         print("%s 在跑步..."%self.name)
13 13 
14 14 p=People("kelvin","安徽灵璧")
15 15 print(hasattr(p,"name"))  #查看对象是否有指定属性和方法,返回值类型为bool型
16 16 print(hasattr(p,"eat"))
17 17 print(hasattr(p,"run"))
18 18 #>>>: True
19 19 #>>>: True
20 20 #>>>: True
21 21 
22 22 print(getattr(p,"name"))  #获取对象的指定属性值
23 23 #>>>: kelvin
24 24 print(getattr(p,"eat"))   #获取对象的指定方法内存地址
25 25 #>>>: <bound method People.eat of <__main__.People object at 0x000001A143506198>>
26 26 print(getattr(p,"eat1","该属性不存在!"))  #获取指定对象的属性或方法,如果该属性或者方法不存在,则返回第三个参数的值(默认参数)
27 27 func=getattr(p,"eat")
28 28 func()
29 29 #>>>: kelvin 在吃饭...
30 30 
31 31 setattr(p,"age","22")  #给对象设置一个属性值
32 32 print(p.__dict__)
33 33 #>>>: {'name': 'kelvin', 'addr': '安徽灵璧', 'age': '22'}
34 34 setattr(p,"name","bob")  #如果设置的属性相同,则代表更新该属性值
35 35 print(p.__dict__)
36 36 #>>>: {'name': 'bob', 'addr': '安徽灵璧', 'age': '22'}
37 37 setattr(p,"func",lambda self:self.name+" is sb") #给对象设置一个函数
38 38 print(p.__dict__)
39 39 print(p.func(p))
40 40 
41 41 def func1():
42 42     return "设置的func1方法!"
43 43 setattr(p,"func1",func1)   #也可以设置一个已经定义的函数名进去
44 44 print(p.__dict__)
45 45 print(p.func1())
46 46 
47 47 delattr(p,"age")  #删除该对象的属性值
48 48 print(p.__dict__)
49 49 #>>>: {'name': 'bob', 'addr': '安徽灵璧'}
复制代码

 

 

 

 

反射的应用实例:

如果员工1和员工2 分别做一个工作,此时员工1 有事耽误了进程,员工2可以使用反射来判断员工1是否已经实现了指定的功能,如果没实现则继续实现自己的业务代码。

复制代码
 1 #Author : Kelvin
 2 #Date : 2019/1/18 20:11
 3 
 4 #员工一的工作
 5 class People:
 6     def __init__(self,name,age):
 7         self.name=name
 8         self.age=age
 9     # def eat(self):
10     #     print("%s 在吃饭..."%self.name)
11     
12 #员工二的工作
13 p=People("kelvin",22)
14 if hasattr(p,"eat"):
15     p.eat()
16 else:
17     print("执行员工2自己的工作!")
复制代码

 

 

双下划綫的attr方法:

复制代码
 1 #Author : Kelvin
 2 #Date : 2019/1/18 20:45
 3 class People:
 4     x=10
 5     def __init__(self,name):
 6         self.name=name
 7     def __getattr__(self, item):
 8         print("__getattr__方法被执行了!")
 9     def __setattr__(self, key, value):
10         print("__setattr__方法被执行了!")
11         self.__dict__[key]=value
12     def __delattr__(self, item):
13         print("__delattr__方法被执行了!")
14         self.__dict__.pop(item)
15 
16 p=People("kelvin")
17 print(p.x)  #对象调用已经存在的成员时,不会执行内置的__getattr__方法
18 print(p.y)  #对象调用不存在的成员时,会执行内置的__getattr__方法
19 
20 p.r=6  #对象添加属性时会触发__setattr__方法
21 p.x=12  #对象修改属性时会触发__setattr__方法
22 print(p.__dict__)
23 
24 del p.x  ##对象删除属性时会触发__delattr__方法
25 print(p.__dict__)
复制代码

 

posted @   佛祖让我来巡山  阅读(136)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

佛祖让我来巡山博客站 - 创建于 2018-08-15

开发工程师个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

Bootstrap中文网

点击右上角即可分享
微信分享提示