Python &引用;加上“;而不是重写超类实例变量

Python &引用;加上“;而不是重写超类实例变量,python,subclass,Python,Subclass,在Python中,有没有这样的方法 class A(): var = "1, 2, 3" class B(): var = ... ", 4" instance = B() instance.var # = 1, 2, 3, 4 问题中给出的示例既不使用超类也不使用实例变量。从问题的标题来看,您可能想同时使用这两个选项。下面是一个如何工作的示例: class A(object): def __init__(self): self.var = "1,2,3"

在Python中,有没有这样的方法

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

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


instance = B()
instance.var # = 1, 2, 3, 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

问题中给出的示例既不使用超类也不使用实例变量。从问题的标题来看,您可能想同时使用这两个选项。下面是一个如何工作的示例:

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

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

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

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


instance = B()
instance.var # = 1, 2, 3, 4
这样做是为了简单的使用,但更有趣的解决方案可能是使用描述符;最简单的方法是使用
属性

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

它在类上的效果与在类实例上的效果一样好

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

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

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


instance = B()
instance.var # = 1, 2, 3, 4
这样做是为了简单的使用,但更有趣的解决方案可能是使用描述符;最简单的方法是使用
属性

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

当你尝试
var=A.var+”,4“
,发生了什么事?哦,伙计,它在类的实例上同样有效。那很容易!请回答这个问题。我将检查是否接受答案。在这种情况下,
A.var
是否表示“从超类获取var”?否,它表示“从
A
获取var”。当然在这种特殊情况下,
A
是超类。@delnan:嗯,不--
B
只有一个超类的
对象。问题标题与提供的代码没有相似之处。在这种情况下,A不是超类;A和B之间没有关系。我担心OP对类和实例变量以及列表和字符串之间的关系感到困惑。当你尝试
var=A.var+”,4“
,发生了什么事?哦,伙计。那很容易!请回答这个问题。我将检查是否接受答案。在这种情况下,
A.var
是否表示“从超类获取var”?否,它表示“从
A
获取var
”。当然在这种特殊情况下,
A
是超类。@delnan:嗯,不--
B
只有一个超类的
对象。问题标题与提供的代码没有相似之处。在这种情况下,A不是超类;A和B之间没有关系。我担心OP会混淆类与实例变量以及列表和字符串之间的关系。这会创建实例变量,这是完全不同的。当然,OP可能真的想要这样,只是把类变量误认为是定义实例变量的快捷方式(这种情况经常发生),但这并不能证明您的答案是正确的,除非您包含这样的解释。即使这样,它也应该是一个类似“你知道吗…?”的注释。问题的标题是“实例变量”。看一看。它还说了“超类”,这又一次;与他的例子完全不同,但肯定回答了这个问题。@delnan,实例变量是OP在文章标题中要求的。。。并且无法在代码中完成这将创建实例变量,这是完全不同的。当然,OP可能真的想要这样,只是把类变量误认为是定义实例变量的快捷方式(这种情况经常发生),但这并不能证明您的答案是正确的,除非您包含这样的解释。即使这样,它也应该是一个类似“你知道吗…?”的注释。问题的标题是“实例变量”。看一看。它还说了“超类”,这又一次;与他的例子完全不同,但肯定回答了这个问题。@delnan,实例变量是OP在文章标题中要求的。。。并且未能在代码中完成