类的实例是否可以知道它是否被用作参数,是否是位置或关键字参数,以及位置,位置,以及关键字,指定了哪个关键字,并遵循所有这些,它可以根据该知识解决/返回/替换其他东西,例如它的一个实例属性,所以调用将其作为参数而不是类实例本身?
我意识到我的课堂问题越来越疯狂。谢谢你的光临。
答案 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了解基于元类的方法。