定义类定义之外的方法?

时间:2012-02-26 17:02:42

标签: python class methods

class MyClass:
    def myFunc(self):
        pass

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

5 个答案:

答案 0 :(得分:68)

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

def func(self):
    print "func"

class MyClass(object):
    myMethod = func

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

class MyClass(object):
    pass

def func(self):
    print "func"

MyClass.myMethod = func

如果需要,您可以在不同的模块中定义函数和类,但我建议不要在一个模块中定义类,然后将其导入另一个模块并动态添加方法(如我的第二个示例中所示),因为然后,根据是否已导入另一个模块,您将从类中获得令人惊讶的不同行为。

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

答案 1 :(得分:5)

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

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

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

def bar(self):
    return "What's " + self.foo

让我们首先看一下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 updog"

这与MyClass2有何不同?在MyClass2中,foobar只是对bar函数的引用,而不是绑定方法。因此,我们必须传递实例才能使此函数正常工作。 e.g。

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 updog"

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

答案 2 :(得分:1)

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

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)

答案 3 :(得分:0)

我会针对你要找的内容进行拍摄,其中一个类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

答案 4 :(得分:-1)

不确定它是否适合您的情况,但您可以从 MyClass 派生并添加您想要的功能。