定义类定义之外的方法?

47 python methods class

class MyClass:
    def myFunc(self):
        pass
Run Code Online (Sandbox Code Playgroud)

我可以MyFunc()在类定义之外创建,甚至可以在另一个模块中创建吗?

Wee*_*ble 78

是.您可以在类之外定义函数,然后在类体中将其用作方法:

def func(self):
    print("func")

class MyClass:
    myMethod = func
Run Code Online (Sandbox Code Playgroud)

您还可以在定义类之后向其中添加函数:

class MyClass:
    pass

def func(self):
    print("func")

MyClass.myMethod = func
Run Code Online (Sandbox Code Playgroud)

如果需要,你可以在不同的模块中定义函数和类,但我建议不要在一个模块中定义类,然后在另一个模块中导入它并动态地添加方法(如我的第二个例子),因为那样你' d根据是否已导入另一个模块,具有与该类有着惊人不同的行为.

我想指出虽然这在Python中是可行的,但它有点不寻常.您在评论中提到"允许用户添加更多"方法.这听起来很奇怪.如果您正在编写库,则可能不希望库的用户将方法动态添加到库中的类.对于库的用户来说,创建自己继承自类的子类比直接更改自己的子类更为正常.

  • 更好的解决方案(根据情况)可以使用 types.MethodType。信用和信息在这里:https://tryolabs.com/blog/2013/07/05/run-time-method-patching-python/ (2认同)

小智 7

不确定这是否有用,但这使我对它更加清楚.虽然我不确定这样做是不是一个好习惯......

class MyClass1(object):
    def __init__(self, bar):
        self.foo = 'up'
        MyClass1.foobar = bar

class MyClass2(object):
    def __init__(self, bar):
        self.foo = 'up'
        self.foobar = bar

def bar(self):
    return "What's " + self.foo
Run Code Online (Sandbox Code Playgroud)

我们先来看看发生了什么MyClass1. foobar在这个类中类似于普通方法,就好像它是在类定义中定义的那样(即它是绑定到该类实例的方法).我们来看看这个样子......

In [2]: x = MyClass1(bar)

In [3]: x.foobar
Out[3]: <bound method MyClass1.bar of <__main__.MyClass1 object at 0x104346990>>

In [4]: x.foobar()
Out[4]: "What's up"
Run Code Online (Sandbox Code Playgroud)

这有MyClass2什么不同?In MyClass2,foobar只是对bar函数的引用,而不是绑定方法.因此,我们必须传递实例才能使此函数正常工作.例如

In [5]: y = MyClass2(bar)

In [6]: y.foobar
Out[6]: <function __main__.bar>

In [7]: y.foobar()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-6feb04878e5f> in <module>()
----> 1 y.foobar()

TypeError: bar() takes exactly 1 argument (0 given)

In [8]: y.foobar(y)
Out[8]: "What's up"
Run Code Online (Sandbox Code Playgroud)

希望这能让它像泥一样清晰......


Mat*_*ock 5

是的,您绝对可以拥有类之外的功能。这是一个小例子......

def date_parse(date_string):
  return date(date_string)


class MyClass:
   def myFunc(self):
       pass

   def myDateFunc(self, date_string):
      self.date = date_parse(date_string)
Run Code Online (Sandbox Code Playgroud)