父类从子类中调用private属性

时间:2018-06-30 04:35:31

标签: python oop

在下面的玩具示例中,最后一行B()。show()没有调用适当版本的show函数。应该将其称为子版本而不是父版本。我想我应该做类似__class_method()的事情,但找不到完整的答案。

我当然可以覆盖B中的show函数。但这实际上意味着复制和粘贴show函数。这不优雅。

## version one ##
class A(object):

    def method(self):
        print("hello")

    def show(self):
        self.method()

class B(A):

    def method(self):
        print("goodbye")


A().show() ## print out hello
B().show() ## print out goodbye

## version two ##    
class A(object):

    def __method(self):
        print("hello")

    def show(self):
        self.__method()

class B(A):

    def __method(self):
        print("goodbye")


A().show() ## print out hello
B().show() ## print out hello

2 个答案:

答案 0 :(得分:0)

如果使用两个下划线开头的方法名称,则只能从该类访问它。考虑以下示例:

stringCol

class A(): def __m(self): pass def m(self): print(self.__m) A().m() # <bound method A.__m of <__main__.A object at 0x10e0c1898>> A().__m() # AttributeError: 'A' object has no attribute '__m' 怎么了?检出A().__m,在其中查找属性:

A.__dict__

最重要的是:

>>> A.__dict__
mappingproxy({'__module__': '__main__', '_A__m': <function A.__m at 0x10e0ab730>, 'm': <function A.m at 0x10e0ab7b8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})

因此,您编写的函数'_A__m': <function A.__m at 0x10e0ab730> 重命名为__m。您无意从类外部的任何位置访问这些方法。

如果您的类中有一个方法_A__m,该方法调用方法show(以__method开头),它将永远只调用该类的该方法,因为它将永远不会知道__,只会知道_B__method

请注意,绝对不要使用_A__method从类外部调用此方法。如果您需要执行自己的操作,则应使用下划线。

如果您确实需要将_A__method的{​​{1}}方法设为私有,那么可以,__method也应覆​​盖B

B

答案 1 :(得分:0)

要保留每个类的私有方法并能够访问它们,可以执行以下操作:

class A(object):

    def __method(self):
        print("hello")
    method = __method

    def show(self):
        self.method()


class B(A):

    def __method(self):
        print("goodbye")
    method = __method

输出:

hello
goodbye