Python 如何修改类方法?

Python 如何修改类方法?,python,class,object,Python,Class,Object,我希望通过改变类的行为来修改类的方法。请注意,我不希望完全重写另一个方法,因为它很复杂,涉及许多变量,并且与其他方法交互。下面是我尝试做的一个例子: import types class example_class(object): def __init__(self, a, b, c): self.a = a self.b = b self.c = c self.pi = 3.14 def example_met

我希望通过改变类的行为来修改类的方法。请注意,我不希望完全重写另一个方法,因为它很复杂,涉及许多变量,并且与其他方法交互。下面是我尝试做的一个例子:

import types
class example_class(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
        self.pi = 3.14

    def example_method(self):
        print(self.a * self.b * self.c * self.pi)

#Create an instance of the object and call the method.
my_example = example_class(3, 5, 7)
my_example.example_method()

#Now I wish to change the "example_method" to add instead of multiply. 
def different_method(self, a, b, c):
    print(self.a + self.b + self.c + self.pi)

my_example.example_method() = types.MethodType(different_method(10,20,30), my_example)
我尝试使用types.MethodType,但上述方法不起作用。注意,我试图用不同的.method()替换example.method()。我想给这个方法不同的值来计算

编辑: 谢谢所有回答我问题的人!你已经为我澄清了,现在我可以修补我的课程了!不过,我应该进一步澄清。我希望修改我的方法以包含另一个变量。所以我不同的方法应该是这样的:

 #Now I wish to change the "example_method" to add instead of multiply. 
 def different_method(self, a, b, c, extra_variable):
     print(self.a + self.b + self.c + extra_variable + self.pi)

我很难添加额外的变量,如果您能提供一些指导,我将非常感谢

您混淆了函数对象和调用这些函数返回的值

# first you replace the method

my_example.example_method = types.MethodType(different_method, my_example)

# then you call it
my_example.example_method(10,20,30)
首先,在
=
的左侧,您有以下内容:

my_example.example_method()
因此,您没有试图替换
my\u example
example\u方法
属性,而是试图将其分配给它返回的任何内容(此处为
None
)。这毫无意义

然后,在右侧,您尝试构建一个方法,不是基于
不同的\u方法
,而是基于调用
不同的\u方法(10,20,30)
的结果。这也毫无意义

你想要的是:

my_example.example_method = types.MethodType(different_method, my_example)

现在,您可以像调用任何其他方法一样调用它:

my_example.example_method(10, 20, 30)

但是,当我们在做的时候,你的
不同的方法也没有多大意义。它接受参数
a、b、c
,但完全忽略它们,只添加
self.a+self.b+self.c
。虽然这并不违法,但有点傻,这意味着新方法没有与您要替换的方法相同的签名,这必然会引起混淆。所以你可能想要的是:

def different_method(self):
    print(self.a + self.b + self.c + self.pi)

my_example.example_method = types.MethodType(different_method, my_example)

my_example.example_method()
如果要添加不同的值,应创建一个新的示例对象,就像要将不同的值相乘一样:

my_other_example = example_class(10, 20, 30)
my_other_example.example_method = types.MethodType(different_method, my_other_example)
my_other_example.example_method()

如果您计划进行大量修补,您可能需要编写一个函数来修补示例对象:

def patch_example(example, different_method):
    example.example_method = types.MethodType(different_method, example)
…所以你可以这样做:

my_third_example = example_class(1, 2.5, 0+1j)
patch_example(my_third_example)
my_third_example.example_method()

(但是,如果确实需要多次执行此操作,则可能需要创建一个子类或其他更高级别的抽象。)

您正在混合函数对象和调用这些函数返回的值

首先,在
=
的左侧,您有以下内容:

my_example.example_method()
因此,您没有试图替换
my\u example
example\u方法
属性,而是试图将其分配给它返回的任何内容(此处为
None
)。这毫无意义

然后,在右侧,您尝试构建一个方法,不是基于
不同的\u方法
,而是基于调用
不同的\u方法(10,20,30)
的结果。这也毫无意义

你想要的是:

my_example.example_method = types.MethodType(different_method, my_example)

现在,您可以像调用任何其他方法一样调用它:

my_example.example_method(10, 20, 30)

但是,当我们在做的时候,你的
不同的方法也没有多大意义。它接受参数
a、b、c
,但完全忽略它们,只添加
self.a+self.b+self.c
。虽然这并不违法,但有点傻,这意味着新方法没有与您要替换的方法相同的签名,这必然会引起混淆。所以你可能想要的是:

def different_method(self):
    print(self.a + self.b + self.c + self.pi)

my_example.example_method = types.MethodType(different_method, my_example)

my_example.example_method()
如果要添加不同的值,应创建一个新的示例对象,就像要将不同的值相乘一样:

my_other_example = example_class(10, 20, 30)
my_other_example.example_method = types.MethodType(different_method, my_other_example)
my_other_example.example_method()

如果您计划进行大量修补,您可能需要编写一个函数来修补示例对象:

def patch_example(example, different_method):
    example.example_method = types.MethodType(different_method, example)
…所以你可以这样做:

my_third_example = example_class(1, 2.5, 0+1j)
patch_example(my_third_example)
my_third_example.example_method()

(但是,如果您确实需要多次这样做,您可能希望创建一个子类或其他更高级别的抽象。)

最后一行应该开始
my_example.example_method=…
(没有参数,因为它不是调用,它是引用)。最后一行应该开始
my_example.example_method=…
(没有parens,因为它不是调用,而是引用)。