我创建了一个“最小”示例:
class C:
def wave(self):
print("C waves")
class A:
def __init__(self):
c = C()
setattr(self, 'wave', getattr(c, 'wave'))
class B(A):
def wave(self):
print("B waves")
>>> a = A()
>>> a.wave()
C waves # as expected
>>> b = B()
>>> b.wave()
C waves # why not 'B waves'?
>>>
在该示例中,类A
显式地将其方法wave
定义为类C
的wave
方法,尽管不是通过更常见的函数定义,而是使用setattr
。然后我们有类B
继承A
,B
尝试用自己的方法重写wave
方法,但是,这是不可能的,发生了什么?我怎样才能解决这个问题
我想保留类A
的setattr
样式定义,如果可能的话,请告知
我从来没有系统地学习过Python,所以我想我对Python的继承和setattr
如何工作缺乏一些理解
类A将
wave()
方法设置为__init__()
中的实例属性。这可以通过检查实例的dict看到:您可以通过从
b
中删除实例成员来解决这个问题移除instance属性后,将从类dict中获取
wave()
函数:这里需要注意的是,当Python查找属性时,实例属性优先于类属性(除非类属性是数据descriptor,但这里不是这种情况)
我还写了一篇blog post文章,更详细地解释了属性查找的工作原理
相关问题 更多 >
编程相关推荐