我有一个由其他人制作的课程A
,我无法编辑:
class A:
def __init__(self, x):
self.x = x
现在我正在尝试从B
继承自己的班级A
,并将x
作为属性而不是属性。
这可能吗?
我已经尝试过:
class B(A):
def __init__(self, x):
super().__init__(x)
@property
def x(self):
return super().x
@x.setter
def x(self, x):
super().x = x
print(x) # my stuff goes here
但正如我所料,这是不可能的:AttributeError: 'super' object has no attribute 'x'
还有其他方法吗,有些可能会工作吗?
答案 0 :(得分:1)
不,您不能将super()
用于除类属性之外的任何内容; x
是实例属性,并且没有属性的继承机制。
实例属性存在于单个命名空间中;没有'父实例'属性名称空间。
您仍然可以在实例__dict__
对象中找到该属性:
class B(A):
@property
def x(self):
return self.__dict__['x']
@x.setter
def x(self, x):
self.__dict__['x'] = x
print(x) # my stuff goes here
属性是数据描述符,这意味着在查询实例属性之前会查找它(请参阅descriptor howto),但您仍然可以直接访问它。