我了解如何通过浏览这些链接在Python中运行时替换方法。[Link1,Link2,& Link3]。
当我更换了" update_private_variable"类A的方法,它被替换但不更新私有变量。
import types
class A:
def __init__(self):
self.__private_variable = None
self.public_variable = None
def update_private_variable(self):
self.__private_variable = "Updated in A"
def update_public_variable(self):
self.public_variable = "Updated in A"
def get_private_variable(self):
return self.__private_variable
class B:
def __init__(self):
self.__private_variable = None
self.public_variable = None
def update_private_variable(self):
self.__private_variable = "Updated in B"
def update_public_variable(self):
self.public_variable = "Updated in B"
在没有替换的情况下调用方法时:
a_instance = A()
a_instance.update_private_variable()
print(a_instance.get_private_variable())
#prints "Updated in A"
更换后调用方法时:
a_instance = A()
a_instance.update_private_variable = types.MethodType(B.update_private_variable, a_instance)
a_instance.update_private_variable()
print(a_instance.get_private_variable())
#prints None
而替换和调用更新公共变量的方法,可以正常工作
a_instance = A()
a_instance.update_public_variable = types.MethodType(B.update_public_variable, a_instance)
a_instance.update_public_variable()
print(a_instance.public_variable)
#prints 'Updated in B'
有没有其他方法可以在运行时替换实例的方法,以便通过调用替换的方法来更新私有属性?
答案 0 :(得分:1)
名称修改背后的想法是保护基类变量不被子类搞乱;换句话说,如果您认为子类有充分的理由修改这些相同的变量,则不应该使用它。
话虽如此,如果你已经走上了这条道路并且现在无法(或不愿意)改变它,你仍然可以过去,但它会变得丑陋和脆弱:
_
正如您所看到的,您必须使用update_private_variable
作为名称受损变量的前缀,并且变量被修改的类的名称。一些后果:
log(n)
方法(因为你必须以某种方式表明目标类......我想你可以将目标类传递给方法,但那只是更丑陋)