在定义类时,我需要在方法上将全局函数(例如,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()很慢吗?
答案 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
。