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......
"""
相关推荐
花生了什么树~.5 分钟前
python基础知识(四)--if语句,for\while循环
python
她似晚风般温柔7897 分钟前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
咩咩大主教9 分钟前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
FuLLovers38 分钟前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
everyStudy2 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
luthane2 小时前
python 实现average mean平均数算法
开发语言·python·算法
码农研究僧2 小时前
Flask 实现用户登录功能的完整示例:前端与后端整合(附Demo)
python·flask·用户登录
Ylucius2 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
凡人的AI工具箱2 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python