将具有特定名称的方法添加到已创建的类实例

时间:2016-05-09 23:32:12

标签: python

设置

假设您已经实例化了class instance,并且需要将函数作为方法附加到类中。

class ClassA(object):
    def __init__(self):
        self.attr1 = 'hello'
        self.attr2 = 'world'

    def get_attr1(self):
        return self.attr1

无论出于何种原因,我们都忽略了创建get_attr2方法。

如果我们创建一个ClassA实例:

a = ClassA()

我们可以定义一个函数,甚至可以调用第一个参数self。

def get_attr2(self):
    return self.attr2

然而,这只能被称为

get_attr2(a)

问题

我们如何设置能够像方法一样调用函数?

a.get_attr2()

2 个答案:

答案 0 :(得分:1)

解决方案

方法是一种特定类型的功能。该类型定义了方法的行为方式,并指定可以通过点约定调用它们。

要解决此问题,我们需要import types。然后,我将创建一个简单的函数,将任何其他函数作为方法附加到现有实例。

import types

def attach_method(class_instance, name, function):
    if name not in class_instance.__dict__.keys():
        class_instance.__dict__[name] = types.MethodType(function, class_instance)

有了这个我跑:

attach_method(a, 'get_attr2', get_attr2)

就是这样。

注意:

function没有名字,所以我必须传递一个名字。

动机

我有一些类,我希望为每个其他类的列表定义方法。我在一个单独的模块中定义了这些其他类。这些课程的创作速度很快。我认为如果我阅读其他模块并生成一个单独的方法来访问模块内的每个类,那么维护会更容易。这可能是也可能不是最好的解决方案,但这正是促使我找到一种方法来实现这一目标的原因。我仍然没有看到更简洁的方法来做到这一点。

答案 1 :(得分:1)

在Python 3中,您可以定义一个函数(使用自变量)并将其绑定到类中的名称,如下所示:

#! python3

class A:
    def b(self):
        print("I am b")

def c(self):
    print("I am c")

A.c = c   # Now A has a method named 'c'

an_a = A()
an_a.b()
an_a.c()

此程序打印"我是b"其次是"我是c"正如你所料。这可能不会导致您所见过的最容易理解的程序,但它有效。