Python学海无涯路【第37回】:反射

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/chuhe163/article/details/101625186


1、什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。

2、反射机制的四个方法

  • getattr 获取指定字符串名称的对象属性
  • setattr 为对象设置一个对象
  • hasattr 判断对象是否有对应的对象(字符串)
  • delattr 删除指定属性

Animal类如下

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def breathe(self):
        print("呼吸")

2.1、hasattr

if __name__ == '__main__':
    animal = Animal("佩奇", 2)
    print(hasattr(animal, "name"))          # 检测试animal对象是否可以调用name属性
    print(hasattr(animal, "breathe"))       # 检测试animal对象是否可以调用breathe属性

输出:
True
True

2.2、getattr

if __name__ == '__main__':
    animal = Animal("佩奇", 2)
    print(getattr(animal,"name"))           #获取animal对象的name属性的值
    print(getattr(animal,"breathe"))        #获取animal对象的breathe属性的值
    print(getattr(animal, "aaaaaaaa","没有这个属性"))  # 获取animal对象的breathe属性的值

输出:
佩奇
<bound method Animal.breathe of <main.Animal object at 0x000000F0D30F0F28>>
没有这个属性

2.3、setattr

  • 用于设置属性值,该属性不一定是存在的。
if __name__ == '__main__':
    animal = Animal("佩奇", 2)
    setattr(animal,"name","乔治")
    print(animal.name)

输出:
乔治

2.4、delattr

if __name__ == '__main__':
    animal = Animal("佩奇", 2)
    print(animal.__dict__)
    delattr(animal,"name")
    print(animal.__dict__)

输出:
{‘name’: ‘佩奇’, ‘age’: 2}
{‘age’: 2}

3、如何获得当前模块名

x = 1
import sys

obj = sys.modules[__name__]
print(getattr(obj, "x"))

输出:
1

猜你喜欢

转载自blog.csdn.net/chuhe163/article/details/101625186