Python覆盖属性不起作用

时间:2018-01-13 16:34:40

标签: python inheritance properties

在下面的代码中,我希望使用属性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

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属性是父类,它不是在无效类中开发的。你需要超载它