2013-03-28 32 views
1

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

的代码将是这样的:

# 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!" 

感谢

回答

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 

虽然有可能是一个非常窄/晦涩的场景,这将是一个最优的实现,你可能会得到更好的通过将在基类的函数,然后参照送达(或以上消除)他们在孩子们的需要。

+0

+1为非标准/奇数。 –

+0

哇,谢谢。 'staticmethod'完美地解决了它。尽管目前这是过分的,但我喜欢阅读元类。 – Blackzafiro