python中object基类的setattr(self, name, value, /)实例方法

本文详细探讨了Python中__setattr__方法的运作机制,通过一个具体示例解释了在对象初始化过程中,如何触发__setattr__方法,以及由此可能引发的AttributeError异常。深入理解这一过程对于掌握Python的动态特性至关重要。

Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ )

class Test:
    def __init__(self):
        self.count = 0
    def __setattr__(self, name, value):
        print('__setattr__')
        self.count += 1
obj = Test()

python3.8执行输出:
haypin@ubt:~/Files$ python3.8 m08026.py
__setattr__
Traceback (most recent call last):
  File "m08026.py", line 7, in <module>
    obj = Test()
  File "m08026.py", line 3, in __init__
    self.count = 0
  File "m08026.py", line 6, in __setattr__
    self.count += 1
AttributeError: 'Test' object has no attribute 'count'
haypin@ubt:~/Files$

        python类如果重写了__setattr__(self, name, value)实例方法,则在任何执行实例属性赋值的语句时,都会默认调用__setattr__()方法。

为什么会出现上述情况呢?我还没有调用__setattr__()呢,只是单纯的定义了一个实例而已? @_@(咋回事?幻觉吗)

看报错信息很容易明白,这是因为:

① __init__()时,给内部属性 self.count进行了赋值;

② 赋值默认调用 __setattr__() 方法

③ 当调用 __setattr__()方法时,首先打印 '__setattr__'字符串,而后执行 self.cout += 1操作

④ 当执行 self.cout 加 1 操作时,将会去寻找 count 这个属性,然而,由于此时 __init__尚未完成,并不存在 count这个属性,因此导致 'AttributeError' 错误

        https://www.cnblogs.com/Jimmy1988/p/6804095.html

### Python `object` 类的方法Python 中,`object` 是所有类的基类。每个类都直接或间接继承自 `object` 类[^2]。因此,`object` 类中定义的方法对所有类的实例都可用。以下是 `object` 类中定义的一些常用方法: 1. **`__new__(cls, [...])`** 这是一个特殊的方法,用于创建并返回一个新的对象实例。通常在自定义对象的创建过程中会重写此方法。 ```python class CustomObject(object): def __new__(cls, *args, **kwargs): instance = super(CustomObject, cls).__new__(cls) return instance ``` 2. **`__init__(self, [...])`** 初始化新创建的对象实例。注意,`__init__` 不是构造函数,它是在对象创建后调用的初始化方法。 ```python class Example: def __init__(self, value): self.value = value ``` 3. **`__str__(self)`** 返回一个可读的字符串表示形式。通常用于打印对象时的输出。 ```python class Example: def __str__(self): return "Example object" ``` 4. **`__repr__(self)`** 返回一个正式的字符串表示形式,通常用于调试和开发环境中的对象表示。 ```python class Example: def __repr__(self): return "<Example>" ``` 5. **`__eq__(self, other)`** 定义了两个对象是否相等的行为。默认情况下,比较的是对象的身份(即内存地址)。 ```python class Example: def __eq__(self, other): return self.value == other.value ``` 6. **`__hash__(self)`** 用于支持对象作为字典键或集合元素。如果重写了 `__eq__` 方法,通常也需要重写 `__hash__` 方法。 ```python class Example: def __hash__(self): return hash(self.value) ``` 7. **`__getattr__(self, name)`** 当访问不存在的属性时被调用。可以用来实现动态属性访问。 ```python class Example: def __getattr__(self, name): return f"Attribute {name} does not exist." ``` 8. **`__setattr__(self, name, value)`** 设置属性值时被调用。可以用来拦截或修改属性赋值行为。 ```python class Example: def __setattr__(self, name, value): if name == "value": self.__dict__[name] = value.upper() else: self.__dict__[name] = value ``` 9. **`__delattr__(self, name)`** 删除属性时被调用。可以用来拦截或限制属性删除操作。 ```python class Example: def __delattr__(self, name): if name in self.__dict__: del self.__dict__[name] ``` 10. **`__dir__(self)`** 返回对象的所有属性和方法的列表。可以通过重写此方法来自定义属性和方法的显示顺序。 11. **`__getattribute__(self, name)`** 访问任何属性时都会调用此方法。与 `__getattr__` 不同,无论属性是否存在都会触发。 ```python class Example: def __getattribute__(self, name): try: return super(Example, self).__getattribute__(name) except AttributeError: return f"Attribute {name} is missing." ``` 这些方法是 `object` 类的一部分,任何类都可以通过继承 `object` 来使用它们。此外,还可以根据需要重写这些方法以实现特定的功能[^2]。 ```python class MyClass: def __init__(self, value): self.value = value def __str__(self): return f"MyClass instance with value: {self.value}" def __eq__(self, other): return self.value == other.value # 示例用法 obj1 = MyClass(10) obj2 = MyClass(10) print(obj1) # 输出: MyClass instance with value: 10 print(obj1 == obj2) # 输出: True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值