【发布时间】:2025-12-06 10:50:02
【问题描述】:
假设 A 类有 10 个方法。一些方法是私有的,它也有私有属性。我想创建 B 类,因此我只能更改最后一个方法,而无需为其余方法复制代码。我的例子如下。目前我无法通过这样的继承来实现它,因为我得到了AttributeError: 'B' object has no attribute '_B__c'
class A:
def __init__(self, a=1, b=2):
self.a = a
self.b = b
self.__foo()
def __foo(self):
self.__c = self.a + self.b
def get_data(self):
return self.__c
class B(A):
def __init__(self, *args, **kwargs):
super(B, self).__init__(*args, **kwargs)
self.__c = self.__modify_data()
def __modify_data(self):
self.__c += 10000
def get_data(self):
return self.__c
b = B(a=5, b=10).get_data()
问题 2: 我可以使用 *args 来实现它,这样我就不必重复所有参数了吗?
编辑: 请参阅我上面的更新代码。 我相信私有属性会导致问题。
我可以继续使用 private 解决它吗?
【问题讨论】:
-
def __init__(self, *args):和super(B, self).__init__(*args) -
如果你想从一个子类访问你的属性,你不能给它们起以双下划线开头的名字,这使得它们对类本身来说是私有的。
-
@Olvin Roght 这给了我:TypeError: __init__() got an unexpected keyword argument 'a'
-
我看到 __private 是导致问题的原因
-
所以本质上,你的问题相当于“我可以使用现有的语言结构来防止访问子类中的属性,同时不防止访问子类中的属性”。