python的反射机制

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

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

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

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

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

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

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

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

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

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

    # __getattr__ 在尝试访问不存在的属性时触发,可以用来动态生成属性值。
    class DynamicAttribute:
        def __getattr__(self, name):
            if name == 'example':
                return "This is a dynamically generated attribute."
            else:
                raise AttributeError(f"'DynamicAttribute' object has no attribute '{name}'")
    
    obj = DynamicAttribute()
    print(obj.example)  # 输出: This is a dynamically generated attribute.
    # 尝试访问不存在的属性
    # print(obj.undefined)  # 抛出 AttributeError
    
    
    
    # __setattr__ 在尝试设置属性值时触发,可以用来控制属性的设置行为。
    class RestrictedAttribute:
        def __init__(self):
            self._value = None
    
        def __setattr__(self, name, value):
            if name == '_value':
                print("Setting _value attribute is not allowed.")
            else:
                super().__setattr__(name, value)
    
    obj = RestrictedAttribute()
    obj._value = 42  # 正常设置
    # 尝试设置受限制的属性
    obj.value = 100  # 输出: Setting _value attribute is not allowed.
    print(obj.value)  # 输出: 100
    
    
    
    
    # __delattr__ 在尝试删除属性时触发,可以用来控制属性的删除行为。
    class ProtectedAttribute:
        def __init__(self):
            self._value = None
    
        def __delattr__(self, name):
            if name == '_value':
                print("Deleting _value attribute is not allowed.")
            else:
                super().__delattr__(name)
    
    obj = ProtectedAttribute()
    obj._value = 42  # 正常设置
    # 尝试删除受保护的属性
    del obj._value  # 输出: Deleting _value attribute is not allowed.
    print(obj._value)  # 输出: 42
    

你可能感兴趣的:(python,python,开发语言)