Python 当父函数已经显式地“setattr”相同的函数时,如何重写该函数?
我创建了一个“最小”示例:Python 当父函数已经显式地“setattr”相同的函数时,如何重写该函数?,python,inheritance,setattr,Python,Inheritance,Setattr,我创建了一个“最小”示例: 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() &g
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
方法,但是,这是不可能的,发生了什么?我怎样才能解决这个问题
我想保留classA
的setattr
样式定义,如果可能的话,请告知
我从来没有系统地学习过Python,所以我想我对Python的继承和
setattr
的工作方式缺乏一些了解。类A将wave()
方法设置为\uu init\uuuuu()
中的实例属性。这可以通过检查实例的dict看到:
>>b.\u dict__
{'wave':}
您可以通过从b
波
>>>b.波浪()
B波
移除实例属性后,将从类dict中获取wave()
函数:
>>B.\u dict__
mappingproxy({''''uuuuuuuuuuuuuuuuuuuu模块:''uuuuuuuuuuuuuuuuuuuuuuu main',
“波浪”:,
“\uuuuuu doc\uuuuuuuuuuuuuu”:无})
这里需要注意的是,当Python查找属性时,实例属性优先于类属性(除非类属性是数据,但这里不是这样)
我还写了一篇回忆录,更详细地解释了属性查找的工作原理。类a将
wave()
方法设置为它在\uuu init\uuu()
中的实例属性。这可以通过检查实例的dict看到:
>>b.\u dict__
{'wave':}
您可以通过从b
波
>>>b.波浪()
B波
移除实例属性后,将从类dict中获取wave()
函数:
>>B.\u dict__
mappingproxy({''''uuuuuuuuuuuuuuuuuuuu模块:''uuuuuuuuuuuuuuuuuuuuuuu main',
“波浪”:,
“\uuuuuu doc\uuuuuuuuuuuuuu”:无})
这里需要注意的是,当Python查找属性时,实例属性优先于类属性(除非类属性是数据,但这里不是这样)
我还写了一篇回忆录,更详细地解释了属性查找的工作原理。谢谢,这正是我想要的!我还更新了我的答案,添加了我的一篇博客文章的链接,以防你想知道更多关于属性查找机制的详细信息(如果在答案中包含所有细节,那就太多了)。谢谢,这正是我想要的!我还更新了我的答案,添加了我的一篇博客文章的链接,以防你想知道更多关于属性查找机制的细节(如果答案中包含所有细节,那就太多了)。