对象成员函数被覆盖
Object members function gets overridden
当我尝试将不同的函数分配给不同的 class 成员时,最后声明的值被覆盖。
class Object:
def __init__(self, *args, **kwargs):
pass
class Service:
@staticmethod
def get_a_value():
return 1
@staticmethod
def get_b_value(*args, **kwargs):
return 2
def __init__(self, *args, **kwargs):
self.a = Object
self.b = Object
self.a.execute = self.get_a_value
self.b.execute = self.get_b_value
if __name__ == '__main__':
obj = Service()
print(obj.a().execute())
print(obj.b().execute())
预期的输出是 1 和 2,但我得到的都是 2。不确定我在这里遗漏了什么。我怎样才能确保我可以将不同的功能分配给 a.execute 和 b.execute。任何帮助将不胜感激。
这是因为 obj.a
和 obj.b
都包含对同一个 class 的引用。
因此,您在 obj.a
上修改的所有内容都将反映在 obj.b
.
中
您可能想要做的是:
def __init__(self, *args, **kwargs):
self.a = Object()
self.b = Object()
self.a.execute = self.get_a_value
self.b.execute = self.get_b_value
如何为您的 a
和 b
成员创建特定对象,其中 class 来自 Object
:
class Object:
def __init__(self, *args, **kwargs):
pass
class Service:
@staticmethod
def get_a_value():
return 1
@staticmethod
def get_b_value(*args, **kwargs):
return 2
def __init__(self, *args, **kwargs):
class ObjectA(Object):
@staticmethod
def execute():
return Service.get_a_value()
class ObjectB(Object):
@staticmethod
def execute():
return Service.get_b_value()
self.a = ObjectA
self.b = ObjectB
if __name__ == '__main__':
obj = Service()
print(obj.a().execute())
print(obj.b().execute())
这会打印
1
2
当然,如果方法不是静态的,这可能会稍微复杂一些,但这可以很容易地在下面的示例中进行调整,其中所有方法都是完整的非静态方法
class Service:
def get_a_value(self):
return self.__a_value
def get_b_value(self):
return self.__b_value
def __init__(self, *args, **kwargs):
self.__a_value = 1
self.__b_value = 2
class ObjectA(Object):
def execute(myself):
return self.get_a_value()
class ObjectB(Object):
def execute(myself):
return self.get_b_value()
您会注意到 execute
方法中使用的 self
引用 Service
的实例(因此 myself
子 classes 中的第一个参数).即使没有方法是静态的,它也能正常工作,并且可以访问实例的值。
有了它,您可以创建成熟的对象接口。
当我尝试将不同的函数分配给不同的 class 成员时,最后声明的值被覆盖。
class Object:
def __init__(self, *args, **kwargs):
pass
class Service:
@staticmethod
def get_a_value():
return 1
@staticmethod
def get_b_value(*args, **kwargs):
return 2
def __init__(self, *args, **kwargs):
self.a = Object
self.b = Object
self.a.execute = self.get_a_value
self.b.execute = self.get_b_value
if __name__ == '__main__':
obj = Service()
print(obj.a().execute())
print(obj.b().execute())
预期的输出是 1 和 2,但我得到的都是 2。不确定我在这里遗漏了什么。我怎样才能确保我可以将不同的功能分配给 a.execute 和 b.execute。任何帮助将不胜感激。
这是因为 obj.a
和 obj.b
都包含对同一个 class 的引用。
因此,您在 obj.a
上修改的所有内容都将反映在 obj.b
.
中
您可能想要做的是:
def __init__(self, *args, **kwargs):
self.a = Object()
self.b = Object()
self.a.execute = self.get_a_value
self.b.execute = self.get_b_value
如何为您的 a
和 b
成员创建特定对象,其中 class 来自 Object
:
class Object:
def __init__(self, *args, **kwargs):
pass
class Service:
@staticmethod
def get_a_value():
return 1
@staticmethod
def get_b_value(*args, **kwargs):
return 2
def __init__(self, *args, **kwargs):
class ObjectA(Object):
@staticmethod
def execute():
return Service.get_a_value()
class ObjectB(Object):
@staticmethod
def execute():
return Service.get_b_value()
self.a = ObjectA
self.b = ObjectB
if __name__ == '__main__':
obj = Service()
print(obj.a().execute())
print(obj.b().execute())
这会打印
1
2
当然,如果方法不是静态的,这可能会稍微复杂一些,但这可以很容易地在下面的示例中进行调整,其中所有方法都是完整的非静态方法
class Service:
def get_a_value(self):
return self.__a_value
def get_b_value(self):
return self.__b_value
def __init__(self, *args, **kwargs):
self.__a_value = 1
self.__b_value = 2
class ObjectA(Object):
def execute(myself):
return self.get_a_value()
class ObjectB(Object):
def execute(myself):
return self.get_b_value()
您会注意到 execute
方法中使用的 self
引用 Service
的实例(因此 myself
子 classes 中的第一个参数).即使没有方法是静态的,它也能正常工作,并且可以访问实例的值。
有了它,您可以创建成熟的对象接口。