【问题标题】:python class B inherit class A with all its methods but change one method onlypython类B继承类A及其所有方法,但仅更改一种方法
【发布时间】: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 是导致问题的原因
  • 所以本质上,你的问题相当于“我可以使用现有的语言结构来防止访问子类中的属性,同时不防止访问子类中的属性”。

标签: python methods overwrite


【解决方案1】:
class A(object):
    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.__modify_data()

    def __modify_data(self):
        self._c += 10000



b = B(a=5, b=10).get_data()
print(b)

输出: 10015

_c 更改为__c 会得到AttributeError: 'B' object has no attribute '_B__c'

是的,__ 通过使变量 c 在子级中无法访问而引起了麻烦,这很好,因为子级不应允许编辑父级的私有变量。

【讨论】:

    最近更新 更多