小能豆

如何在不破坏默认行为的情况下覆盖 __getattr__ ?

javascript

如何在不破坏默认行为的情况下覆盖 getattr


阅读 33

收藏
2024-10-12

共1个答案

小能豆

要覆盖__getattr__Python 中的方法,同时保留未明确定义的属性的默认行为,可以遵循以下模式:

  1. 定义您的__getattr__方法:当在通常的位置找不到属性时(即,它不是实例属性或在类中找到__dict__),将调用此方法。
  2. 用于super()调用默认行为:当您想要保留未明确处理的属性的默认行为时__getattr__,您可以调用默认实现。

以下示例演示了如何执行此操作:

class MyClass:
    def __init__(self):
        self.existing_attr = "I exist!"

    def __getattr__(self, name):
        # Custom behavior for missing attributes
        if name == 'dynamic_attr':
            return "I am a dynamically created attribute!"
        # For any other missing attribute, use the default behavior
        # You can raise an AttributeError or return a default value
        raise AttributeError(f"{name} is not a valid attribute")

# Example usage
obj = MyClass()

# Accessing an existing attribute
print(obj.existing_attr)  # Output: I exist!

# Accessing a dynamically created attribute
print(obj.dynamic_attr)   # Output: I am a dynamically created attribute!

# Attempting to access an undefined attribute
try:
    print(obj.undefined_attr)
except AttributeError as e:
    print(e)  # Output: undefined_attr is not a valid attribute

解释:

  • 在这个例子中,existing_attr是一个实例属性,并且访问它可以正常进行。
  • 当尝试访问时dynamic_attr__getattr__将调用该方法,该方法返回一个自定义字符串。
  • undefined_attr如果访问未定义的属性(如),__getattr__则会引发AttributeError,这是未找到属性时的默认行为。

重点:

  • 默认行为:通过引发AttributeError,当属性不存在时,您可以保持 Python 的默认行为。这对于与 Python 的属性访问机制的兼容性很重要。
  • super()谨慎使用super()在 中通常不需要调用__getattr__,因为只有在未找到属性时才会调用此方法。如果您想提供默认行为,则可以在方法中明确定义它。
2024-10-12