Python 反射

1. 反射

通过字符串映射或修改程序运行时的状态、属性、方法,有以下4个方法。

  • hasattr(obj,str): 判断一个对象obj里是否有对应的str字符串的方法
  • getattr(obj,str,defaullt=None):根据字符串去获取obj对象里,对应方法的内存地址
  • setattr(obj,str,func):给模块添加属性(函数或变量)
  • delattr(obj,str):删除模块中某个变量或函数
class Dog(object):
    def __init__(self,name):
        self.name = name
    def eat(self,food):
        print("%s is eating %s" %(self.name,food))
d = Dog("泰迪")
# 输入方法
choice = input(">>>:").strip()
# 判断 choice输入的方法是否在 d对象里
if hasattr(d,choice):
    # 返回 choice对象
    attr = getattr(d,choice)
    attr("骨头")	# 运行方法

添加方法:

# bulk方法
def bulk(self):
    print("%s is yelling...."%self.name)
class Dog(object):
    def __init__(self,name):
        self.name = name
    def eat(self,food):
        print("%s is eating %s" %(self.name,food))
d = Dog("泰迪")
# 输入方法
choice = input(">>>:").strip()
# 判断 choice输入的方法是否在 d对象里
if hasattr(d,choice):
    attr = getattr(d,choice)
    attr("骨头")
else:
    setattr(d,choice,bulk)	# 添加bulk方法
    func = getattr(d,choice)	# 获取方法
    func(d)

删除方法:

class Dog(object):
    def __init__(self,name):
        self.name = name
    def eat(self,food):
        print("%s is eating %s" %(self.name,food))
d = Dog("泰迪")
# 输入方法
choice = input(">>>:").strip()
# 判断 choice输入的方法是否在 d对象里
if hasattr(d,choice):
    delattr(d,choice)	# 删除方法
# 打印name
print(d.name)

反射自己模块中的变量和函数:

import sys
cc = sys.modules['__main__']    # 查看自己的模块
def af():
    print("af_1111")
def bf():
    print("bf_2222")
name = "jack"

while True:
    aa = input(">>>:")
    if hasattr(cc,aa):
        func = getattr(cc,aa)
        # print(func)   # 反射自己模块中的变量
        # func()        # 反射自己模块中的函数
posted @ 2023-10-10 15:36  Crazy丶迷恋  阅读(19)  评论(0编辑  收藏  举报