python-在类定义之外定义方法?

class MyClass:
    def myFunc(self):
        pass

是否可以在类定义之外甚至在另一个模块中创建MyFunc()

martineau asked 2020-02-29T13:47:23Z
4个解决方案
78 votes

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

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

class MyClass:
    myMethod = func

您还可以在定义一个函数后将其添加到类中:

class MyClass:
    pass

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

MyClass.myMethod = func

您可以根据需要在不同的模块中定义函数和类,但是我建议不要在一个模块中定义该类,然后再将其导入另一个模块中并向其中动态添加方法(如第二个示例),因为那样的话 d根据是否已导入另一个模块,其行为与类具有令人惊讶的不同。

我要指出的是,尽管这在Python中是可能的,但这有点不寻常。 您在评论中提到“允许用户添加更多”方法。 听起来很奇怪。 如果您正在编写一个库,则可能不希望该库的用户向该库中的类动态添加方法。 库用户创建自己的从您的类继承的子类比直接更改您的子类更为正常。

Weeble answered 2020-02-29T14:01:32Z
7 votes

您可以在类之外定义一个函数,然后添加它。 但是,在将函数分配给类或实例对象方面存在细微的差异。 这是一个例子:

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

让我们首先看一下MyClass2中发生的情况。该类中的MyClass2与普通方法类似,就好像它是在类定义中定义的一样(即,它是绑定到此类实例的方法)。 让我们看一下它是什么样的...

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"

这与MyClass2有何不同? 在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"

尽管我不确定这样做是否是一种好习惯...

ewellinger answered 2020-02-29T14:02:06Z
1 votes

是的,您肯定可以在类之外具有函数。 这是一个迷你示例...

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)
Matt Alcock answered 2020-02-29T14:02:26Z
0 votes

我为您寻找的内容拍摄了照片,其中一个类Helper为某个专业类提供功能(MyClass

class Helper(object):

    def add(self, a, b):
        return a + b

    def mul(self, a, b):
        return a * b


class MyClass(Helper):

    def __init__(self):
        Helper.__init__(self)
        print self.add(1, 1)


if __name__ == '__main__':
    obj = MyClass()

这将打印

>>> 2
aweis answered 2020-02-29T14:02:50Z
translate from https://stackoverflow.com:/questions/9455111/define-a-method-outside-of-class-definition