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......
"""
相关推荐
不相心 -w-6 分钟前
Cmake的基础用法
linux·开发语言·c++
WangChenGe7 分钟前
Windows 10/11 上 Pyenv-win 完整安装教程
python
想会飞的蒲公英7 分钟前
PyTorch中SGD 与 Momentum 从零理解:给最朴素的优化器加上“惯性“
人工智能·pytorch·python·深度学习·机器学习
拿铁铁20 分钟前
平板坡口机换碳刷时间参考手册
python·电脑
撑伞的鱼993720 分钟前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
大数据张老师27 分钟前
Typora 导出 Word 模版操作手册
开发语言·c#·word·typora
略略略咯咯31 分钟前
stream流浅拷贝
开发语言·python
long31633 分钟前
Java 团队入门到精通学习资料
java·开发语言
vx-程序开发36 分钟前
【java项目分享】springboot农产品销售平台14952
java·javascript·spring boot·python·eclipse·django·php
城管不管1 小时前
rabbitmq如何保证消息不丢失?解决方案又是什么?
开发语言·ai·面试·职场和发展·rabbitmq·php·agent