Python &引用;加上“;而不是重写超类实例变量
在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"
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在文章标题中要求的。。。并且未能在代码中完成