Python重写属性不起作用
在下面的代码中,如果我使用属性Python重写属性不起作用,python,inheritance,properties,Python,Inheritance,Properties,在下面的代码中,如果我使用属性val或调用函数get\u val,我希望这不重要。输出应该是相同的 #! /usr/bin/env python class A(): def get_val(self): print(self) raise NotImplementedError val = property(get_val) class B(A): def __init__(self): self.b_val = "
val
或调用函数get\u val
,我希望这不重要。输出应该是相同的
#! /usr/bin/env python
class A():
def get_val(self):
print(self)
raise NotImplementedError
val = property(get_val)
class B(A):
def __init__(self):
self.b_val = "foo\n"
def get_val(self):
print(self)
return self.b_val
b = B()
print(b.get_val())
print(b.val)
但我得到的结果是:
<__main__.B object at 0x0000014BD2BBE898>
foo
<__main__.B object at 0x0000014BD2BBE898>
Traceback (most recent call last):
File "prop_override_test.py", line 20, in <module>
print(b.val)
File "prop_override_test.py", line 6, in get_val
raise NotImplementedError
NotImplementedError
val属性属于未加载到Inrited类中的父类。您需要重载它您还必须重载
B
中的属性:
class A():
def get_val(self):
print(self)
raise NotImplementedError
val = property(get_val)
class B(A):
def __init__(self):
self.b_val = "foo\n"
def get_val(self):
print(self)
return self.b_val
val = property(get_val)
或者,由于实际上不需要get\u val
,请使用decorator语法:
#!/usr/bin/env python
class A():
@property
def val(self):
print(self)
raise NotImplementedError
class B(A):
def __init__(self):
self.b_val = "foo\n"
@property
def val(self):
print(self)
return self.b_val
b = B()
print(b.val)
您没有覆盖
B
中的val
,因此它仍然使用A.val
,这是属性(A.get\u val)
,因为val
在类A中并且绑定到A.get\u val()。也就是说,它绑定到方法的引用,而不是方法的名称。将@a.val.getter
添加到B
上的get_val
方法的装饰器中。因为val
是一个类属性,并且在构建a
时进行计算,所以它绑定到a
的方法。请参见和,显然,但是为什么呢?因为事情就是这样。它将在未找到的子类中查看值,然后在父类中查找该值,这将引发异常。@advay.umare:nope,请重试。对不起,这不是一个有用的答案。
#!/usr/bin/env python
class A():
@property
def val(self):
print(self)
raise NotImplementedError
class B(A):
def __init__(self):
self.b_val = "foo\n"
@property
def val(self):
print(self)
return self.b_val
b = B()
print(b.val)