【发布时间】:2019-09-10 18:13:15
【问题描述】:
我试图让一个子类从某个父类继承一个方法,该方法指向父类自己的私有变量。我希望孩子的继承方法使用孩子自己的私有变量。在不重新定义子类中的整个方法的情况下,这可能吗?
如果使用公共或受保护(单下划线)变量,代码可以正常工作。但是我们的讲师坚持使用私有(双下划线)变量。我们只接触了几天的面向对象编程,所以我真的不知道我在寻找什么术语(对不起!)。
我怀疑我应该只使用受保护的,但我想尽可能地遵守说明。
class ClassA:
def __init__(self): self.__var = 10
def method1(self):
self.__var += 1 #method1 is intended to work on ClassA's __var
return self.__var #The method will also return the processed value of ClassA's __var
class ClassB(ClassA):
def __init__(self): self.__var = 20
#ClassA's method1 is inherited by ClassB.
#But I want this method1 to use ClassB's __var
ObjectA = ClassA()
ObjectB = ClassB()
print(ObjectA.method1()) #Will output 11
print(ObjectB.method1()) #Will raise an AttributeError, still looks for __var of ClassA
以上只是我打算实现的目标的演示。
当使用公共或受保护变量时,我将得到11 和21 的输出。
然而,当使用私有变量时,我会收到一个11 和一个错误。
我希望ClassB 的method1 使用ClassB 的__var (_ClassB__var)。
我可以让ClassB 拥有一个名为_ClassA__var 的变量并将其设置为20,它确实可以工作,但IMO 有点混乱。
编辑:我想我找到了答案。
class ClassA:
def __init__(self): self.__var = 10
def method1(self): return self.get_var() + 1
def get_var(self): return self.__var
def set_var(self, val): self.__var = val
class ClassB(ClassA):
def __init__(self): self.__var = 20
def get_var(self): return self.__var
def set_var(self, val): self.__var = val
ObjectA = ClassA()
ObjectB = ClassB()
print(ObjectA.method1())
print(ObjectB.method1())
我没有直接引用类属性,而是让方法指向一个 getter。这个想法来自这篇文章下的评论。在此编辑中,它不包含在答案中,因此为了清楚起见,我将其放在这里。
谢谢,@艾伦!
【问题讨论】:
-
__-prefixed 名称的目的是防止出现您想要的阴影类型。 -
如果您的讲师坚持使用双下划线属性,他们可能希望您对这些属性使用 getter 和 setter。 (这不是你在真正的 Python 编程中应该做的事情,但为了这门课程,这可能是你必须做的事情。)
-
@user2357112 感谢您的评论。是的,我们的讲师希望我们包括 getter 和 setter。但是,我想使用父类中的方法,而不是它的属性。我希望这个继承的方法使用孩子自己的属性。
-
如果您的讲师需要 getter 和 setter,您仍然需要复制它们以使它们同时适用于
ClassA和ClassB。然后method1将成为一个可以在两个类中工作的单一实现,因为它会调用这些getter 和setter。 -
@Allan 哦!我想我喜欢这个主意,它很到位。我从来没有想过像那样使用 getter 和 setter。如果您可以将其添加到下面的答案中,我可以将其标记为已接受。 :)
标签: python