Python 类实例能否知道它是否';什么是争论?

Python 类实例能否知道它是否';什么是争论?,python,class,properties,arguments,Python,Class,Properties,Arguments,类的实例是否可以知道它是否被用作参数,它是位置参数还是关键字参数,如果是位置参数,它位于哪个位置,如果是关键字,它被分配到哪个关键字,并且在所有这些之后,它是否可以基于这些知识解析/返回/替换自身,例如,它的一个实例属性,因此调用将其作为参数而不是类实例本身获取 我意识到我的课堂提问越来越疯狂。谢谢你的幽默。不,这一切都不可能 试着想一想如何接近它——你可以定义一个装饰器,将参数循环到一个函数,并告诉参数这些信息 def toldargs(f): def wrapper(*args, *

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


我意识到我的课堂提问越来越疯狂。谢谢你的幽默。

不,这一切都不可能

试着想一想如何接近它——你可以定义一个装饰器,将参数循环到一个函数,并告诉参数这些信息

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或实例测试,以避免参数出现错误,这些参数不需要这样的调用

更新-再想一想,您(可能)并不真正关心什么时候传递给函数,而是关心调用实例上的某个操作时的上下文是什么(如果将参数传递给函数但从未使用过,那么在我能想到的任何情况下,这都无关紧要)

换言之:

def some_function(a, b):
    # here you can't trigger anything
    ...
    a.foo() # but here you can
调用
.foo()
时,您可以检查上下文。有多种方法-最明显/最粗糙的方法是抛出异常、捕获异常并检查调用堆栈。但是你也可以使用所有的工具。因此,例如,您可以检查当前堆栈,查看是否从特定类内部调用您

再一次,这可能是缓慢而复杂的


更新2-有关基于元类的方法,请参阅。

否。但是,您可以在相应的上下文中实现方法来自动将类转换为其他值(例如整数或字符串)。疯狂的问题可能意味着疯狂的设计……谢谢,andrew。这里比较棘手的一点是,我的实例可以使用的函数不是我写的,我不能修改。我的类实例是一个层次结构,但很容易被认为是一个概念。我希望在任何地方都可以自由地使用实例的名称,大多数事情不会像Python中的任何函数那样被我简单地接收到,但是我知道的一些事情需要层次结构的一些子部分,我希望它能够智能地提供正确的子部分。我当然可以指定子部分,但不必这样做很好。我并不真正了解细节,但这让我想到了另一种可能的解决方案-参见上面的更新。是的,我一直在想我是否可以对inspect做些什么。这无疑是进入了疯狂代码的领域,我不想在这个世界上访问它,但看到什么是可能的还是很有趣的,通过这些探索,我总能学到很多关于Python核心的知识。谢谢你的帮助,安德鲁。