Python,如何将非类方法保持为非类方法?

时间:2013-03-28 17:08:19

标签: python function methods

我正在创建一组调用在不同模块中定义的函数的类。要知道他们必须调用哪个函数,函数将存储为类的变量(或者至少是我尝试过的函数)。但是,当我尝试调用它时,它会自动假定该函数是一个类方法并将“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!"

由于

1 个答案:

答案 0 :(得分: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

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