我正在使用无法控制的类(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)
答案 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__
必须处理三种情况:
_SuperClass__main
本身,用于在self.__main
中分配给__init__
时。self.__main
上的属性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