2

一个类的实例能否知道它是否被用作参数,它是位置参数还是关键字参数,如果是位置,它在哪个位置,如果是关键字,它被分配给哪个关键字,并且遵循所有这些,可以吗?基于该知识解析为/返回/替换自身,例如其实例属性之一,因此调用将其作为参数而不是类实例本身?

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

4

1 回答 1

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):
    ...

(未编译/未经测试)。

如果您在经常调用的函数上使用它,这将显着影响性能。并且您可能需要在调用方法之前进行某种尝试/捕获或实例测试,以避免出现不期望此类调用的参数错误。

更新-再想一想,您(可能)并不真正关心何时将某些内容传递给函数,而是在调用实例上的某些操作时的上下文是什么(如果将 arg 传递给函数但从未使用过,那么没关系,反正我能想到)。

换句话说:

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

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

再一次,这可能会很慢而且很复杂......

更新 2 - 请参阅Python:在类实例初始化之前修改传递的参数以了解基于元类的方法。

于 2012-05-03T09:36:18.370 回答