“追加”而不是覆盖超类实例变量

时间:2011-10-07 17:43:13

标签: python subclass

在Python中,有没有办法做这样的事情?

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

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


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

2 个答案:

答案 0 :(得分:4)

问题中给出的示例既不使用超类也不使用实例变量。从问题的标题来看,大概你想要同时使用两者。以下是它如何工作的示例:

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

请注意,您的示例只是使用类排序类似命名空间将属性分配给不相关的类。这是完全合理的,但不完全是你问的:

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

class B:
  var = A.var + ",4,5"

print A.var
print B.var

答案 1 :(得分:1)

你无法追加,你替换,但你可以用包含原文的表达式替换:

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

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


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

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

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

class B(A):
    _subvar = ", 4"
    @property
    def var(self):
        return super(B, self).var + self._subvar


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

适用于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')

对于类,它在类

的实例上同样有效