对象成员函数被覆盖

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.aobj.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

如何为您的 ab 成员创建特定对象,其中 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 中的第一个参数).即使没有方法是静态的,它也能正常工作,并且可以访问实例的值。

有了它,您可以创建成熟的对象接口。