类实例可以知道它是否是一个参数?

时间:2012-05-03 09:16:07

标签: python class properties arguments

类的实例是否可以知道它是否被用作参数,是否是位置或关键字参数,以及位置,位置,以及关键字,指定了哪个关键字,并遵循所有这些,它可以根据该知识解决/返回/替换其他东西,例如它的一个实例属性,所以调用将其作为参数而不是类实例本身?

我意识到我的课堂问题越来越疯狂。谢谢你的光临。

1 个答案:

答案 0 :(得分:3)

不 - 这一切都不可能。

试着想一想你如何接近 - 你可以定义一个装饰器来循环函数的参数并告诉参数这个信息。

def toldargs(f):
    def wrapper(*args, **kargs):
        for i, arg in enumerate(args):
            arg.you_are_arg_number(i)
        for k in kargs:
            kargs[k].you_are_karg_named(k)
        return f(*args, **kargs)
    return wrapper

@toldargs
def myfunction(a, b):
    ...

(未编译/未测试)。

如果在经常调用的函数上使用它,这将显着影响性能。并且在调用方法之前你可能需要某种try / catch或实例测试,以避免错误的参数不期望这样的调用。

更新 - 想一想,你(可能)并不真正关心何时将某些内容传递给函数,但是当你的实例上的某些操作被调用时,上下文是什么(如果是arg被传递给一个函数但从未使用过,那么无所谓,无论如何我都能想到。)

换句话说,

def some_function(a, b):
    # here you can't trigger anything
    ...
    a.foo() # but here you can

调用.foo()时,您可以检查上下文。有各种方法 - 最明显的/原始的是抛出异常,捕获它,并检查调用堆栈。但您也可以使用所有工具here。因此,例如,您可以检查当前堆栈以查看是否从特定类中调用。

再次,这可能会变得缓慢而复杂......

更新2 - 请参阅Python: Modifying passed arguments before class instance initialization了解基于元类的方法。