【问题标题】:Python, how to keep a non-class method as non-class method?Python,如何将非类方法保留为非类方法?
【发布时间】:2013-03-28 17:08:18
【问题描述】:

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

谢谢

【问题讨论】:

    标签: python function methods


    【解决方案1】:

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

    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
    

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

    【讨论】:

    • 哇,谢谢。 staticmethod 完美解决。尽管目前它有点矫枉过正,但我​​喜欢阅读有关元类的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多