在下面的代码中,我希望使用属性val
或调用函数get_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
为什么属性不使用覆盖get_val
函数?
我使用的是python版本3.6.2
python --version
Python 3.6.2
答案 0 :(得分:0)
您必须在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_val
,所以请使用装饰器语法:
#!/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)
答案 1 :(得分:-2)
val属性是父类,它不是在无效类中开发的。你需要超载它