Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当父函数已经显式地“setattr”相同的函数时,如何重写该函数?_Python_Inheritance_Setattr - Fatal编程技术网

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
方法,但是,这是不可能的,发生了什么?我怎样才能解决这个问题

我想保留class
A
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查找属性时,实例属性优先于类属性(除非类属性是数据,但这里不是这样)


我还写了一篇回忆录,更详细地解释了属性查找的工作原理。

谢谢,这正是我想要的!我还更新了我的答案,添加了我的一篇博客文章的链接,以防你想知道更多关于属性查找机制的详细信息(如果在答案中包含所有细节,那就太多了)。谢谢,这正是我想要的!我还更新了我的答案,添加了我的一篇博客文章的链接,以防你想知道更多关于属性查找机制的细节(如果答案中包含所有细节,那就太多了)。