1

我正在制作一组调用在不同模块中定义的函数的类。要知道他们必须调用哪个函数,该函数存储为类的变量(或者至少这是我尝试过的)。但是,当我尝试调用它时,它会自动假定该函数是一个类方法并将“self”作为参数传递,这在逻辑上会导致错误,因为该函数接收到的参数太多。你知道我怎样才能避免函数成为类方法。

代码如下:

# Module A
def func1(a):
    print a
def func2(a):
    print a,a

# Module B
from A import *
class Parent:
    def func():
        self.sonFunc("Hiya!")
class Son1:
    sonFunc = func1
class Son2:
    sonFunc = func2

so = Son1()
s.func()
# Should print "Hiya!"
s = Son2()
s.func()
# Should print "Hiya! Hiya!"

谢谢

4

1 回答 1

5

您正在做的事情有点不标准/奇怪,但这应该可行:

class Son_1(object):

    son_func = staticmethod(func_1)

class Son_2(object):

    son_func = staticmethod(func_2)

通常,staticmethod用作装饰器,但由于装饰器只是语法糖,您也可以这样使用它们。

一种可以说更清洁但也更先进的方法是metaclass

class HasSonMeta(type):

    def __new__(cls, name, bases, attrs):

        attrs['son_func'] = staticmethod(attrs.pop('__son_func__'))
        return type.__new__(cls, name, bases, attrs)


class Son1(object):

     __metaclass__ = HasSonMeta
     __son_func__ = func_1

class Son2(object):

    __metaclass__ = HasSonMeta
    __son_func__ = func_2

使用这种形式,您还可以直接在类中定义函数(尽管这样会使阅读此代码的人更加困惑):

class Son3(object):

    __metaclass__ = HasSonMeta

    def __son_func__():

        pass

虽然可能有一个非常狭窄/晦涩的场景,这将是一个最佳实现,但通过将您的函数放在基类中,然后根据需要在子类中引用(或覆盖)它们,您可能会得到更好的服务。

于 2013-03-28T17:13:27.530 回答