gpt4 book ai didi

python - 在子类中访问父类(super class)的属性 setter

转载 作者:行者123 更新时间:2023-11-28 22:29:54 28 4
gpt4 key购买 nike

我有一个 SuperClass,它定义了一个属性,它是 setter,如下所示:

class A(object):
def __init__(self):
self._mode = None

@property
def mode(self):
# to be overriden in subclass to implement the actual getter code
raise NotImplementedError

@mode.setter
def mode(self, value):
# common assertions and input validations
self._set_mode(value)

def _set_mode(self, value):
# to be overriden in subclass to implement the actual setter code
raise NotImplementedError


class B(A):
@property
def mode(self):
return self._mode

def _set_mode(self, value):
self._mode = value


obj = B()
obj.mode = 'test'

哪个加注

obj.mode = 'test'
AttributeError: can't set attribute

似乎我必须在 B 中注册一个 setter。我通常会像 @A.mode.setter 那样做,但这并不完全适用,因为我不实际上想在 B 中定义一个新的 setter,只需重新使用 A 中的那个即可。
有没有人暗示如何解决这个问题?可能微不足道,但我现在没有看到它:/

最佳答案

getter 和 setter 存储为 property 对象的属性(分别为 .fget.fset),所以一旦您在子类中重载了您最明确地同时提供 getter 和 setter 的属性,即:

class B(A):
@property
def mode(self):
return self._mode

@mode.setter
def mode(self, value):
self._mode = value

因此,如果您想让 getter 和/或 setter 可重载而不必重新声明该属性,您必须定义一个 _get_mode 方法并将您的属性的 getter 委托(delegate)给此方法,就像您一样为二传手做了。

class A(object):
def __init__(self):
self._mode = None

@property
def mode(self):
return self._get_mode()

def _get_mode(self):
# to be overriden in subclass to implement the actual getter code
raise NotImplementedError

@mode.setter
def mode(self, value):
# common assertions and input validations
self._set_mode(value)

def _set_mode(self, value):
# to be overriden in subclass to implement the actual setter code
raise NotImplementedError


class B(A):

def _get_mode(self):
return self._mode

def _set_mode(self, value):
self._mode = value

关于python - 在子类中访问父类(super class)的属性 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42763283/

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