簡體   English   中英

屬性設置器在Python類中不起作用

[英]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__必須處理以下三種情況:

  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)

我還建議更簡單的選擇,即從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM