【问题标题】:add method with a specific name to already created class instance将具有特定名称的方法添加到已创建的类实例
【发布时间】:2016-09-04 18:05:02
【问题描述】:

设置

假设您有一个已经实例化的classinstance,您需要将一个函数作为方法附加到该类。

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()

【问题讨论】:

    标签: python


    【解决方案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 没有名字,所以我必须传递一个名字。

    动机

    我有一些类,我希望在其中为一长串其他类中的每一个定义方法。我在一个单独的模块中定义了这些其他类。这些类是快速创建的。我认为如果我阅读这个另一个模块并生成一个单独的方法来访问模块内的每个类,它会更容易维护。这可能是也可能不是最好的解决方案,但正是它促使我找到一种方法来做到这一点。我还没有看到更简洁的方法来做到这一点。

    【讨论】:

      【解决方案2】:

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

      #! 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()
      

      如您所料,该程序会打印“I am b”后跟“I am c”。这可能不会产生您见过的最容易理解的程序,但它确实有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        相关资源
        最近更新 更多