gpt4 book ai didi

python - 属性 setter 在 Python 类中不起作用

转载 作者:行者123 更新时间:2023-12-01 00:39:58 25 4
gpt4 key购买 nike

我正在使用一个我无法控制的类(MainClass)。我想将我的类基于 MainClass,但添加额外的功能。我已经向我的类(SuperClass)添加了一个属性(索引),但是当我尝试将索引转换为属性时,@.setter 似乎被忽略。这里出了什么问题?

class MainClass(object):
def __init__(self):
self.name = 'abc'

class SuperClass(object):
def __init__(self, main, *args, **kwargs):
super(SuperClass, self).__init__(*args, **kwargs)
self.__main = main
self._index = 0

def __getattr__(self, attr):
return getattr(self.__main, attr)

def __setattr__(self, attr, val):
if attr == '_SuperClass__main':
object.__setattr__(self, attr, val)
return setattr(self.__main, attr, val)

@property
def index(self):
return self._index

@index.setter
def index(self, value):
self._index = value

main_object = MainClass()
super_object = SuperClass(main_object)
print('x', super_object.index, super_object.name)

super_object.index = 3
print('y', super_object.index)

super_object.index += 2
print('z', super_object.index)

最佳答案

__getattr__ 仅在正常查找机制失败时使用。

然而,

__setattr__ 会在所有尝试设置属性时被调用。这意味着您当前的定义在MainClass 实例,而不是访问属性的 setter。

>>> super_object._SuperClass__main.index
2

因为 __setattr__ 总是调用 setattr(self.__main, attr, val)+= 被有效地视为 =.

__setattr__ 必须处理三种情况:

  1. 属性 _SuperClass__main 本身,用于在 __init__ 中分配给 self.__main 时使用。
  2. self.__main 上存在的属性进行赋值
  3. 对特定于SuperClass的属性进行赋值。

考虑到这一点,尝试一下

def __setattr__(self, attr, val):
if attr == '_SuperClass__main':
super().__setattr__(attr, val)
elif hasattr(self.__main, attr):
setattr(self.__main, attr, val)
else:
super().__setattr__(attr, val)

关于python - 属性 setter 在 Python 类中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com