python - 对象成员函数被重写

标签 python oop python-3.6

当我尝试将不同的函数分配给不同的类成员时,最后声明的值会被覆盖。

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 分配不同的函数。任何帮助将不胜感激。

最佳答案

如何使用派生自 Object 的类为 ab 成员创建特定对象:

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子类中的第一个参数)。即使没有方法是静态的,它也可以工作,并且可以访问实例的值。

这样,您就可以创建成熟的对象接口(interface)。

关于python - 对象成员函数被重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57249564/

相关文章:

java - 多态列表和关系数据库

c# - 这是使用多态性的正确方法吗

python - tkinter 单选按钮不显示类中的值

python - 如何使 pydantic 类字段不可变?

python - 如何将十六进制字符串转换为整数?

Python循环遍历Dataframe 'Series'对象没有属性

python - cam.release() 后网络摄像头灯仍然亮着

python - 获取groupby后每列的百分比

python - 为什么在 Python 3.6 alpha 中文字格式的字符串(f 字符串)如此缓慢? (现在在 3.6 稳定版中修复)

Python - 第一个单词未包含在搜索中