python的魔法方法2

本文详细解释了Python中的魔法方法getattr、getattribute、setattr、delattr和__dir__的工作原理,展示了如何自定义这些方法来处理对象属性的访问、设置和删除,以及如何影响dir()函数的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值