在下面的玩具示例中,最后一行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
答案 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