python- 属性访问

本文深入探讨了Python中getattr(), setattr(), delattr()等内置函数的使用方法,详细解析了它们在对象属性操作中的作用,包括如何避免递归调用,以及在自定义类中如何正确重写__setattr__等特殊方法。

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

getattr()

  Docstring: getattr(object, name[, default]) -> value Get a named attribute from an object;

   getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case.

setattr()

  Signature: setattr(obj, name, value, /)

  Docstring: Sets the named attribute on the given object to the specified value.

  setattr(x, 'y', v) is equivalent to ``x.y = v''

delattr()

  Signature: delattr(obj, name, /)

  Docstring: Deletes the named attribute from the given object.

  delattr(x, 'y') is equivalent to ``del x.y''

避免内置函数的递归调用:

 1 class rectan():
 2     def __init__(self, x, y):
 3         self.x = x
 4         self.y = y
 5         
 6     def __setattr__(self, name, value):
 7         print('setattr')
 8         if name == 'square':
 9             self.x = vlaue
10             self.y = value
11             
12 #             super().__setattr__('x', value)
13 #             super().__setattr__('y', value)
14         else:
15 #             self.name = value
16             super().__setattr__(name, value)

如使用第15 行进行赋值操作会出现递归现象,这是由于,在实例化对象时,调用了 __init__()方法, 而该方法中进行了 属性设置操作,对于该对象来说就需要调用该对象的__setattr__()方法进行属性设置,而15行的属性设置仍然需要调用该对象本身的__setattr__()方法,从而产生递归调用,解决办法是使用 16行代码,使用其他对象的__setattr__()方法,由于父类与该对象有直接关系,因此调用父类的方法。

而 第9,10 行不会发生递归现象,是因为,在第一次进入 if语句后,进行属性设置操作,调用__setattr__()方法,但是注意此时由于 属性名已经不再是 square ,因此在if语句内进行属性设置时虽然调用了自身的 __setattr__()方法,但是会进入 else语句,执行父类的__setattr__()方法,因此不会产生递归。比较直接的方法是, 不在 __setattr__()方法中调用自身的__setattr__()方法,直接使用父类的方法,如12,13行所示。

 也可通过一个内置的变量进行赋值操作:self.__dict__[name]=value

属性名以字符串的方式传入。

__getattr__(self, name):定义当试图访问一个不存在的属性名时的行为。(基类object 中无该方法)

__getattribute__(self, name):定义该类的属性被访问时的行为。 属性被访问时先访问的方法

__setattr__(self, name, value):定义一个属性被设置时的行为

__delattr__(self, name): 定义一个属性被删除时的行为

 1 class test():
 2     def __setattr__(self, name, value):
 3         print('setattr')
 4         super().__setattr__(name, value)
 5         
 6     def __getattr__(self,name):
 7         print('setattr')
 8 
 9     
10     def __getattribute__(self, name):
11         print('getattribute')
12         return super().__getattribute__(name)
13     
14     def __delattr__(self, name):
15         print('delsttr')
16         super().__delattr__(name)
17         
18 t = test()
19 setattr(t,'x',10)
20 getattr(t,'x')
21 delattr(t,'x')
22 getattr(t,'x')
23 
24 ################################
25 
26 setattr
27 getattribute
28 delsttr
29 getattribute
30 setatt

转载于:https://www.cnblogs.com/JYNNO1/p/10479738.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值