Python魔法方法-属性访问控制详解
在 Python 中,使用属性(Attribute)可以方便的访问对象的状态和行为,可以理解为类中的变量和函数。但是如果对属性访问没有进行控制,可能会影响到程序的正确性和安全性。此时,就需要使用一些特殊的函数,也就是 Python 的一些魔法方法。本文将详细讲解 Python 中属性访问控制的魔法方法。
魔法方法 getattr 和 getattribute
在 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'
魔法方法 setattr 和 delattr
和 getattr 和 getattribute 相对应的,Python 魔法方法还提供了 setattr 和 delattr。
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 中属性访问控制的四个魔法方法 getattr、getattribute、setattr 和 delattr,可以通过这些方法对属性进行访问控制和保护。