• python的反射机制


            Python的反射机制指的是在运行时(runtime)动态地获取对象的信息、调用对象的方法、访问对象的属性等能力。反射使得你可以根据需要在运行时操作对象,而不需要在编译时确定对象的类型。在Python中,反射主要通过以下几个内置函数和特殊方法来实现:

    1. dir() 函数:dir(obj) 用于列出对象 obj 的所有属性和方法。这包括对象的内置属性和方法,以及用户自定义的属性和方法。

      1. class MyClass:
      2. def __init__(self):
      3. self.name = "John"
      4. self.age = 30
      5. def say_hello(self):
      6. print(f"Hello, my name is {self.name}.")
      7. obj = MyClass()
      8. # 使用 dir() 函数列出对象的属性和方法
      9. attributes_and_methods = dir(obj)
      10. print(attributes_and_methods)
    2. getattr() 函数:getattr(obj, name[, default]) 用于获取对象 obj 的属性或方法 name 的值。如果属性或方法不存在,可以提供一个可选的默认值。

      1. class Person:
      2. def __init__(self, name, age):
      3. self.name = name
      4. self.age = age
      5. person = Person("Alice", 25)
      6. # 使用 getattr() 函数获取对象的属性值
      7. name = getattr(person, "name")
      8. age = getattr(person, "age")
      9. print(name, age)
    3. setattr() 函数:setattr(obj, name, value) 用于设置对象 obj 的属性或方法 name 的值为 value。如果属性或方法不存在,它会创建一个新的属性或方法。

      1. class Car:
      2. def __init__(self, make, model):
      3. self.make = make
      4. self.model = model
      5. car = Car("Toyota", "Camry")
      6. # 使用 setattr() 函数设置对象的属性值
      7. setattr(car, "make", "Honda")
      8. setattr(car, "color", "Blue") # 创建新属性
      9. print(car.make, car.model, car.color)
    4. hasattr() 函数:hasattr(obj, name) 用于检查对象 obj 是否有属性或方法 name。如果有,返回 True,否则返回 False

      1. class Dog:
      2. def __init__(self, name):
      3. self.name = name
      4. dog = Dog("Buddy")
      5. # 使用 hasattr() 函数检查对象是否有某个属性
      6. has_name = hasattr(dog, "name")
      7. has_age = hasattr(dog, "age")
      8. print(has_name) # True
      9. print(has_age) # False
    5. delattr() 函数:delattr(obj, name) 用于删除对象 obj 的属性或方法 name

      1. class Book:
      2. def __init__(self, title):
      3. self.title = title
      4. book = Book("Python Programming")
      5. # 使用 delattr() 函数删除对象的属性
      6. delattr(book, "title")
      7. # 尝试访问已删除的属性将引发 AttributeError
      8. # print(book.title)
    6. globals()locals() 函数:这些函数用于获取全局和局部命名空间中的变量和函数。

      1. x = 10
      2. def my_function():
      3. y = 20
      4. print(locals()) # 获取局部命名空间中的变量和函数
      5. print(globals()) # 获取全局命名空间中的变量和函数
    7. vars() 函数:vars(obj)返回对象的 __dict__ 属性,它包含对象的属性和方法。

      1. class MyClass:
      2. def __init__(self):
      3. self.x = 10
      4. self.y = 20
      5. obj = MyClass()
      6. print(vars(obj)) # 返回对象的属性字典 {'x': 10, 'y': 20}
    8. callable() 函数:callable(name) 用于检查对象是否可以调用,例如检查函数、方法或类是否可调用。

      1. def my_function():
      2. print("Hello, World!")
      3. class MyClass:
      4. def my_method(self):
      5. print("Method called")
      6. # 检查对象是否可调用
      7. is_function_callable = callable(my_function)
      8. is_method_callable = callable(MyClass.my_method)
    9. 特殊方法(例如 __getattr____setattr____delattr__):你可以在自定义类中定义这些特殊方法,以自定义对象的属性和方法访问行为。

      1. # __getattr__ 在尝试访问不存在的属性时触发,可以用来动态生成属性值。
      2. class DynamicAttribute:
      3. def __getattr__(self, name):
      4. if name == 'example':
      5. return "This is a dynamically generated attribute."
      6. else:
      7. raise AttributeError(f"'DynamicAttribute' object has no attribute '{name}'")
      8. obj = DynamicAttribute()
      9. print(obj.example) # 输出: This is a dynamically generated attribute.
      10. # 尝试访问不存在的属性
      11. # print(obj.undefined) # 抛出 AttributeError
      12. # __setattr__ 在尝试设置属性值时触发,可以用来控制属性的设置行为。
      13. class RestrictedAttribute:
      14. def __init__(self):
      15. self._value = None
      16. def __setattr__(self, name, value):
      17. if name == '_value':
      18. print("Setting _value attribute is not allowed.")
      19. else:
      20. super().__setattr__(name, value)
      21. obj = RestrictedAttribute()
      22. obj._value = 42 # 正常设置
      23. # 尝试设置受限制的属性
      24. obj.value = 100 # 输出: Setting _value attribute is not allowed.
      25. print(obj.value) # 输出: 100
      26. # __delattr__ 在尝试删除属性时触发,可以用来控制属性的删除行为。
      27. class ProtectedAttribute:
      28. def __init__(self):
      29. self._value = None
      30. def __delattr__(self, name):
      31. if name == '_value':
      32. print("Deleting _value attribute is not allowed.")
      33. else:
      34. super().__delattr__(name)
      35. obj = ProtectedAttribute()
      36. obj._value = 42 # 正常设置
      37. # 尝试删除受保护的属性
      38. del obj._value # 输出: Deleting _value attribute is not allowed.
      39. print(obj._value) # 输出: 42

  • 相关阅读:
    Flutter 中的 ButtonBarTheme 小部件:全面指南
    结束八天了,还是无法与她和解. --vulnhub 靶场
    【VIO】第1讲 IMU 传感器
    Java基础篇(简单语法的一些细节介绍)
    python使用tkinter实现学生信息管理系统(下)
    HTTPS的传输过程
    知名IT网站博客园陷入绝境
    嵌入式分享合集35
    web3.js:使用eth包
    四元数的可视化
  • 原文地址:https://blog.csdn.net/weixin_65784341/article/details/132898615