gpt4 book ai didi

python - 初始化子类中在父类中使用的属性

转载 作者:行者123 更新时间:2023-12-01 06:26:37 25 4
gpt4 key购买 nike

我正在使用第 3 方 Python 库 (wxPython),该库的一个模块中有一个有缺陷的类。
有问题的代码部分如下所示:

def OnText(self, event):
value = self.GetValue()
if value != self.__oldvalue:
pass # Here some more code follows ...
self.__oldvalue = value

问题在于 if 语句,因为第一次调用此方法时 self.__oldvalue 尚未初始化。因此,在库开发人员修复此错误之前,对于解决方法,我认为我可以通过一些解决方法来解决此问题。我只是想从该错误的类派生一个子类并在此构造函数中初始化 self.__oldvalue:

class MyIntCtrl(wx.lib.intctrl.IntCtrl):
def __init__(self, *args, **kw):
self.__oldvalue = None
super().__init__(*args, **kw)

但是,现在当我使用这个新类 MyIntCtrl 而不是原来的 IntCtrl 类时,我确实得到了与以前完全相同的错误:

Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/wx/lib/intctrl.py", line 509, in OnText
if value != self.__oldvalue:
AttributeError: 'MyIntCtrl' object has no attribute '_IntCtrl__oldvalue'

现在我想知道:我做错了什么,我还能如何在子类中解决这个问题?

最佳答案

任何以__(双下划线)开头的类成员都是私有(private)的,您可以使用单下划线_或在命名中不使用下划线以在派生类中访问它们.

class Parent:
def __init__(self):
self.__private_field = "private field"
self._protected_field = "protected field"
self.public_field = "public field"

class Child(Parent):
def __init__(self):
pass

def do(self):
print(self.__private_field) # It will throw exception
print(self._protected_field) # It will not throw exception
print(self.public_field) # It will not throw exception

或者您可以通过如下方式调用私有(private)/ protected 成员来绕过它们:

print(_Parent__private_field)

关于python - 初始化子类中在父类中使用的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60113537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com