繁体   English   中英

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

[英]Python, how to keep a non-class method as non-class method?

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

谢谢

您正在执行的操作有点不合标准/奇怪,但这应该可以:

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

尽管可能会出现一个非常狭窄/模糊的场景,这将是一个最佳实现,但您最好将函数放在基类中,然后在子级中根据需要引用(或重写)它们,从而为您提供更好的服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM