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
。我仍然认为这是有点黑客,你应该重新设计代码。