![](/img/trans.png)
[英]Implementing a class to represent cards, python property setter not working properly
[英]Property setter not working in Python class
我正在使用無法控制的類(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)
您定義的__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
__getattr__
僅在常規查找機制失敗時使用。
但是, 所有嘗試設置屬性的嘗試都將調用__setattr__
。 這意味着您當前的定義在MainClass
實例上創建一個名為index
的屬性,而不是訪問該屬性的設置器。
>>> super_object._SuperClass__main.index
2
因為__setattr__
總是調用setattr(self.__main, attr, val)
,所以+=
實際上被視為=
。
__setattr__
必須處理以下三種情況:
_SuperClass__main
本身,用於在__init__
分配給self.__main
時使用。 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)
我還建議更簡單的選擇,即從MainClass
繼承而不是使用組合和委派:
class SuperClass(MainClass):
def __init__(self):
super().__init__()
self._index = 0
@property
def index(self):
return self._index
@index.setter
def index(self, value):
self._index = value
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.