python魔法方法-属性访问控制详解

  • Post category:Python

Python魔法方法-属性访问控制详解

在 Python 中,使用属性(Attribute)可以方便的访问对象的状态和行为,可以理解为类中的变量和函数。但是如果对属性访问没有进行控制,可能会影响到程序的正确性和安全性。此时,就需要使用一些特殊的函数,也就是 Python 的一些魔法方法。本文将详细讲解 Python 中属性访问控制的魔法方法。

魔法方法 getattrgetattribute

在 Python 中,如果我们访问一个对象的属性,如果该属性存在于对象中,则直接返回该属性的值,否则 Python 就会调用对象的 getattr 方法来获取值。如果 getattr 方法未定义,则会抛出 AttributeError 异常。

class MyClass:
    def __init__(self):
        self.name = 'MyClass'

    def __getattr__(self, name):
        return 'Attribute {} not found'.format(name)

obj = MyClass()
print(obj.name)  # 'MyClass'
print(obj.age)   # 'Attribute age not found'

getattr 方法相似的还有一个方法 getattribute。区别在于在 Python 中调用该方法时,已经确定需要获取的属性名称,因此该方法不能返回 None。

class MyClass:
    def __init__(self):
        self.name = 'MyClass'

    def __getattribute__(self, name):
        if name == 'name':
            return self.name.upper()
        else:
            return 'Attribute {} not found'.format(name)

obj = MyClass()
print(obj.name)  # 'MYCLASS'
print(obj.age)   # 'Attribute age not found'

魔法方法 setattrdelattr

getattrgetattribute 相对应的,Python 魔法方法还提供了 setattrdelattr

setattr 方法会在对象的属性被设置时自动调用,允许我们对属性设置进行控制:

class MyClass:
    def __init__(self):
        self._name = 'MyClass'

    def __setattr__(self, name, value):
        if name == 'name':
            self._name = value.upper()
        else:
            super().__setattr__(name, value)

obj = MyClass()
obj.name = 'test'
print(obj.name)  # 'TEST'

delattr 方法会在对象的属性被删除时调用:

class MyClass:
    def __init__(self):
        self._name = 'MyClass'

    def __delattr__(self, name):
        if name == 'name':
            print('Can not delete attribute name.')
        else:
            super().__delattr__(name)

obj = MyClass()
del obj.name    # Can not delete attribute name.

本文介绍了 Python 中属性访问控制的四个魔法方法 getattrgetattributesetattrdelattr,可以通过这些方法对属性进行访问控制和保护。