在定义过程中如何确定引用类中的全局对象?

时间:2014-06-05 06:06:30

标签: python python-2.7 python-3.x

在定义类时,我需要在方法上将全局函数(例如,abc)设置为默认arg值。通常,将它们称为abc是微不足道的。

但问题是abc本身被设置为该类的类方法。所以 通常的soln不起作用因为 abc在创建“abcd”时在类定义期间引用“abc,classmethod”。一个解决方案可能是重新排序类方法定义的东西。在最后,但我需要一个确定的(顺序不可知)方式引用全局abc

只有一种粗暴的做法,我知道,使用globals()[“abc”] 。我想知道是否有更好的解决方法。

def abc(cls,a=1):
    print a+1


class A(object):
    abc=classmethod(abc)
    @classmethod
    def abcd(cls,func=abc):
        pass

from inspect import getargspec
getargspec(A.abcd).defaults[0] #should be "abc" the function, not "abc" classmethod

可能(但不太好?)soln

def abcd(cls,func=globals()["abc"])

修改

另外,你认为globals()很慢吗?

2 个答案:

答案 0 :(得分:2)

在自己的命名空间中包装abc和类似的用例选项,如此

class A:
    @staticmethod
    def abc(cls, *args, **kwargs):
        pass

然后你可以干净地引用它们

class Foo:
    abc = classmethod(A.abc)

    @classmethod
    def abcd(cls, fn=A.abc):
        pass

顺序并不重要。

您还可以考虑以下解决方法:

避免名称冲突:

def _abc(cls, *args, **kwargs):
    pass

class Foo:
    abc = classmethod(_abc)

    @classmethod
    def abcd(cls, fn=_abc):
        pass

在课堂外做所有受影响的defs:

def abc(cls, *args, **kwargs):
    pass

def abcd(cls, fn=abc):
    pass

class Foo:
    abc = classmethod(abc)
    abcd = classmethod(abcd)

答案 1 :(得分:1)

这是一种方式:

def abc(cls,a=1):
    print a+1


class A(object):
    @classmethod
    def abcd(cls,func=abc):
        pass

A.abc=classmethod(abc)

这取决于你是否"更好"而不是使用globals