Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对象成员函数被重写_Python_Oop_Python 3.6 - Fatal编程技术网

Python 对象成员函数被重写

Python 对象成员函数被重写,python,oop,python-3.6,Python,Oop,Python 3.6,当我尝试将不同的函数分配给不同的类成员时,最后声明的值将被覆盖 类对象: 定义初始化(self,*args,**kwargs): 通过 班级服务: @静力学方法 def get_a_值(): 返回1 @静力学方法 def get_b_值(*args,**kwargs): 返回2 定义初始化(self,*args,**kwargs): self.a=对象 self.b=对象 self.a.execute=self.get\u a\u值 self.b.execute=self.get_b_值 如果u

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

类对象:
定义初始化(self,*args,**kwargs):
通过
班级服务:
@静力学方法
def get_a_值():
返回1
@静力学方法
def get_b_值(*args,**kwargs):
返回2
定义初始化(self,*args,**kwargs):
self.a=对象
self.b=对象
self.a.execute=self.get\u a\u值
self.b.execute=self.get_b_值
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
obj=服务()
打印(obj.a().execute())
打印(obj.b().execute())

预期的输出是1和2,但我得到的都是2。不知道我错过了什么。如何确保可以为a.execute和b.execute分配不同的函数。任何帮助都将不胜感激。

这是因为
obj.a
obj.b
都包含对同一类的引用。 因此,您在
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
成员创建特定对象,其中类派生自
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
的实例(因此子类中的
imf
第一个参数)。即使没有静态方法,它也可以工作,并且可以访问实例的值


使用它,您可以创建完整的对象接口。

self.a
self.b
都是对
对象的引用。只有一个
对象
。您两次都在覆盖同一个
Object.execute=…
。在这种情况下,是否有一种解决办法,可以将不同的方法分配给类成员?@user2635060不分配给类,而是分配给不同的实例。从任何方面看,这都不是一种好的做法,因此,我首先要重新定义您在这里尝试做的事情,而不是要求“变通办法”。我试图创建自己的类来模拟GCP服务。这些类成员必须能够在类外调用。因此,参考问题@用户2635060向
对象
添加
\u调用
方法。继续@LouisSaglio的建议,
\u调用
方法应返回
self
。我仍然认为这是有点黑客,你应该重新设计代码。