我正在创建一组调用在不同模块中定义的函数的类。要知道他们必须调用哪个函数,函数将存储为类的变量(或者至少是我尝试过的函数)。但是,当我尝试调用它时,它会自动假定该函数是一个类方法并将“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!"
由于
答案 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
虽然可能存在一个非常狭窄/模糊的场景,这将是一个最佳实现,但通过将您的函数放在基类中然后根据子节点的需要引用(或覆盖)它们可能会更好。