属性设置器在Python类中不起作用

时间:2019-08-09 15:35:31

标签: python oop properties

我正在使用无法控制的类(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)

3 个答案:

答案 0 :(得分:1)

您定义的__setattr__方法优先于@index.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

    @property
    def name(self):
        return self.__main.name

    @name.setter
    def name(self):
        return self.__main.name

    @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)

输出:

x 0 abc
y 3
z 5

答案 1 :(得分:1)

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

但是,

__setattr__被尝试用于 all 设置属性。这意味着您当前的定义在以下位置创建了一个名为index的属性。 MainClass实例,而不是访问属性的设置器。

>>> super_object._SuperClass__main.index
2

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

__setattr__必须处理三种情况:

  1. 属性_SuperClass__main本身,用于在self.__main中分配给__init__时。
  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)

答案 2 :(得分:0)

我还建议使用更简单的选项,即仅从flex-direction继承,而不使用组合和委派:

? ALines(laLines, "hello"+Chr(0)+"there",1+4,Chr(0)) && prints 2
display memory like laLines && shows two string values
相关问题