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)