Python的反射

通过字符串的形式操作对象的属性

python 复制代码
class Person(object):
    def __init__(self,name,age) -> None:
        self.name=name
        self.age=age
    def walking(self):
        print("walking......")

获取对象的属性

python 复制代码
p=Person("Recardo",12)
# 获取队形的name属性
a=getattr(p,"name")
# Recardo
print(a)

为对象添加static的属性

python 复制代码
p=Person("Recardo",12)
# 添加static 属性的变量
setattr(p,"yanling","show me the flowers")
# show me the flowers
print(p.yanling)

为对象添加方法

python 复制代码
p=Person("Recardo",12)
#对实例添加方法
def talking(self):
    print(self.name,"is talking")
# 为p对象添加名为speak的方法
setattr(p,"speak",talking)
# Recardo is talking
p.speak(p)

对Student类添加方法

python 复制代码
p=Person("Recardo",12)
#对实例添加方法
def talking(self):
    print(self.name,"is talking")
#对Person类添加方法
setattr(Person,"speak2",talking)
# p对象调用Person类的方法
# Recardo is talking
p.speak2()

删除对象的变量

python 复制代码
p=Person("Recardo",12)
# 相当于del p.age
delattr(p,"age") 
# AttributeError: 'Person' object has no attribute 'age'
print(p.age)

输入对象的方法名,对象执行方法

python 复制代码
class Person(object):
    def __init__(self,name,age) -> None:
        self.name=name
        self.age=age
    def walking(self):
        print(self.name," is walking......")

p=Person("Recardo",12)
user_command=input(">>:").strip()
if hasattr(p,user_command):
    func=getattr(p,user_command)
    func()
"""
>>:walking
Recardo  is walking......
"""

__name__属性

reflect2.py

python 复制代码
"""
reflect2.py
magical reflect2
__name__
反射一个.py文件下的字符串的属性
"""

class Person(object):
    def __init__(self,name,age) -> None:
        self.name=name
        self.age=age
    def walking(self):
        print("walking......")


print("outside the __main__")
print(__name__)
#在被别的模块导入的时候,发挥作用,被导入时,__name__=="xxx.py"中的xxx
#不被导入时,__name__=="__main__"
if __name__=="__main__":
    print("inside the __main__")
    print(__name__)
"""
outside the __main__
__main__
inside the __main__
__main__
"""

此时,无论是main方法里面还是main方法外面,name__都等于__main

reflect4.py

python 复制代码
import reflect2 as r2

运行reflect4.py

控制台打印:

python 复制代码
outside the __main__
reflect2

此时,reflect2中的name是reflect2

夸文件反射

python 复制代码
# reflect4.py
# 导入reflect2.py
import reflect2 as r2

if hasattr(r2,"Person"):
    PersonClass=getattr(r2,"Person")
    p=PersonClass("ChenLuo",3)
    print(p.name)
    print(p.age)
    p.walking()

"""
运行结果:
outside the __main__
reflect2
ChenLuo
3
walking......
"""
相关推荐
zh_xuan10 小时前
kotlin常见面试题
开发语言·kotlin·面试题
用户2986985301411 小时前
用 Python 自动化把 JavaScript 代码转换为 Word 文档
javascript·python·api
用户0190275816111 小时前
AlphaFeed 标的池(universes)全解:CN_Stock / CN_ETF 与权限边界
python
青少儿编程课堂11 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
用户03321266636712 小时前
如何使用 Python 将 JSON 转换为 Excel
python·excel
小小张说故事12 小时前
Python 的切片到底切了什么:拆开 slice 对象、负步长和 __getitem__
python
草莓熊Lotso12 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
huaqianzkh13 小时前
WinForm C#:循环修改控件UI闪烁卡顿?SuspendLayout / ResumeLayout 与 BeginUpdate 优化
开发语言·ui·c#
沐晓时光1 天前
C语言入门,内存函数知识讲解
c语言·开发语言
用户956256254291 天前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api