python的魔法方法2
getattr
我们先看下面的代码
class A:
def __init__(self, age):
self.age = age
o = A(18)
print(o.age)
print("============")
print(o.score)
结果
18
============
Traceback (most recent call last):
File "/Users/yinzhang/PycharmProjects/MyTest/test1.py", line 9, in <module>
print(o.score)
AttributeError: 'A' object has no attribute 'score'
我们发现当我们使用o.age的时候,实际上是在尝试access这个对象的一个属性,但是当这个属性在这个对象不存在的时候,就报错了,AttributeError,告诉咱们,没有这个属性啊。
那attr就是帮我们来做这个默认值的,也就是说,我们访问这个对象不存在的属性,我们不想让他报错了,想让他返回其他东西。
class A:
def __init__(self, age):
self.age = age
def __getattr__(self, name):
print(f"getting:{
name}")
raise AttributeError
o = A(18)
print(o.age)
print("============")
print(o.score)
结果
18
============
getting:score
Traceback (most recent call last):
File "/Users/yinzhang/PycharmProjects/MyTest/test1.py", line 13, in <module>
print(o.score)
File "/Users/yinzhang/PycharmProjects/MyTest/test1.py", line 7, in __getattr__
raise AttributeError
AttributeError
首先呢,我们定义了attr方法,使其当访问这个对象不存在的属性的时候打印了getting:不存在属性的string,然后又手动抛出了一个AttributeError。当我们使用o.score来访问一个o对象不存在的属性的时候,就会请求到attr上,然后attr会将o.score的score最为string参数传递给attr函数。
比如说,当我们希望有人访问了这个对象不存在的属性的时候不报错,而是返回一个None,当然,这并不是很合理的行为,我们只是用来做演示。
class A:
def __init__(self, age):
self.age = age
def __getattr__(self, name):
print(f"getting:{
name}")
return None
o = A(18)
print(