«Добавить» вместо переопределения переменных экземпляра суперкласса - PullRequest
0 голосов
/ 07 октября 2011

Есть ли в Python способ сделать что-то подобное?

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

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


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

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

Пример, приведенный в вопросе, не использует ни суперкласс, ни переменную экземпляра.Из заголовка вопроса, по-видимому, вы хотели использовать оба.Вот пример того, как это будет работать:

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 голос
/ 07 октября 2011

вы не можете добавить, вы заменяете, но вы можете заменить выражением, которое включает в себя оригинал:

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')

, который одинаково хорошо работает на классе, как и на экземплярах класса

...