我是一个带有两个功能的导入模块
def kind1(paramA, paramB)
...
def kind2(paramA, paramB)
我通过构造函数将这两个函数中的一个随机传递给一个对象。
object = Constructor(param1, param2, function)
现在用
>>> print object.function
我得到了
function kind1 at 0xb124...
或
function kind2 at 0xb1464...
如何检查object.function是kind1还是kind2?
我已经尝试了
if object.function == kind1:
print 'kind1'
elif object.function == kind2:
print 'kind2'
和
if object.function == kind1():
print 'kind1'
elif object.function == kind2():
print 'kind2'
我也试过
if isinstance(object.function, kind1):
print 'kind1'
elif isinstance(object.function, kind2):
print 'kind2'
但他们显然没有工作。 执行此检查的正确方法是什么?
答案 0 :(得分:1)
我认为您需要将函数(方法)引用为ObjectInstance.kind1
和ClassOfObject.kind1
由于
type(ClassOfObject.kind1) == <class 'function'>
和
type(ObjectInstance.kind1) == <class 'method'>
并且具有不同的地址很难直接比较,解决方法是使用一些属性来比较它(比如.__name__
或制作自己的地址)
答案 1 :(得分:0)
您的代码示例与您描述的行为不匹配,为属性分配函数对象不会更改该对象的标识:
def foo():
pass
class Klass(object):
def __init__(self, f):
self.f = f
a = Klass(foo)
print(a.f is foo) # True
print(a.f == foo) # True
答案 2 :(得分:0)
使用id
函数检查对象标识:
def foo():
pass
def bar():
pass
def whatisit(fn):
case = {
id(foo) : "foo",
id(bar) : "bar",
}
print "got function %s" % case[id(fn)]
# see what we get
whatisit(foo)
whatisit(bar)
=>
got function foo
got function bar
请注意,使用fn.__name__
可能是可以接受的,具体取决于您的特定系统(在某些系统中,这将被视为安全风险):
def foo():
pass
def sybil():
pass
# let's be evil
sybil.__name__ = 'foo'
# social engineering ;-)
print foo.__name__ == sybil.__name__
#=> True
# always check identity
print id(foo) == id(sybil)
#=> False
如果您必须依赖名称而不是id(例如,如果将函数传递给子进程或远程进程),至少使用read-only code object中的安全路径:
# the unforgeable name, similar to a fingerprint
print foo.__code__.co_name == sybil.__code__.co_name
#=> False
如果您想知道恶意功能的奇特名称,请查看维基百科的Alice and Bob。