的实例能否知道它是否被用作参数,它是位置参数还是关键字参数,如果是位置参数,它位于哪个位置,如果关键字,它被分配给哪个关键字,以及遵循所有这些,它是否可以根据该知识解析/返回/替换自己为其他内容,例如它的实例属性之一, 所以调用将其作为参数而不是类实例本身获取?
我意识到我的课堂问题越来越疯狂。谢谢你幽默我。
不 - 这些都是不可能的。
尝试思考如何接近 - 您可以定义一个装饰器,该装饰器将参数循环到函数并告诉参数此信息。
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()
时,可以检查上下文。 有多种方法 - 最明显/最粗糙的是抛出异常,捕获它并检查调用堆栈。 但您也可以在此处使用所有工具。 因此,例如,您可以检查当前堆栈以查看是否从特定类内部调用您。
同样,这可能会缓慢而复杂...
更新 2 - 请参阅 Python:在基于元类的方法的类实例初始化之前修改传递的参数。