“追加”而不是重写超类实例变量

2024-04-26 09:19:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,有没有一种方法可以做到这样呢?在

class A():
    var = "1, 2, 3"

class B():
    var = ... ", 4"


instance = B()
instance.var # = 1, 2, 3, 4

Tags: 方法instancevarclass
2条回答

不能追加、替换,但可以用包含原始表达式的表达式替换:

class A(object):
    var = "1, 2, 3"

class B(A):
    var = A.var + ", 4"


instance = B()
instance.var # = 1, 2, 3, 4

这样做只是为了简单的用途,但是更有趣的解决方案可能是使用描述符;简单的方法是使用property

^{pr2}$

它适用于B的实例,但不适用于B本身(如第一个示例所示)。要找回它,您必须实现自己的描述符:

class Appender(object):
    def __init__(self, cls, attr):
        self.cls = cls
        self.attr = attr
    def __get__(self, instance, owner):
        var = super(self.cls, owner).var
        return var + getattr(self.cls, self.attr)

class B(A):
    _realvar = ', 4'
B.var = Appender(B, '_realvar')

它在类上和在类的实例上同样有效

问题中给出的例子既没有使用超类,也没有使用实例变量。从问题的标题来看,你可能想同时使用这两种方法。下面是一个如何工作的示例:

class A(object):
  def __init__(self):
    self.var = "1,2,3"

class B(A):
  def __init__(self):
    super(B,self).__init__()
    self.var += ",4,5"

print A().var
print B().var

请注意,只需使用不相关的类的属性来赋值。这是完全合理的,但不完全是你所要求的:

^{pr2}$

相关问题 更多 >