python独立函数返回调用它的对象实例

标签 python metaprogramming

我有一个非常奇怪的问题。

我需要返回一个类对象来调用一个应该返回调用它的类对象的函数。我知道我知道。只是将其视为一种人为的练习,尽管对我来说这是非常真实的需要。

def baz():
    # return the object instance that calls me. 

class Foo():
    def bar(self, func):
        return func()  # should return the Foo object but how???

new_foo = Foo()
new_foo_instance = new_foo.bar(baz)

可以在baz()中写任何东西吗?这将返回调用它的对象?

编辑:

回复评论:

我尝试过使用检查,但没有成功,我什至查看了整个堆栈,但找不到与 new_foo 匹配的条目对象:

new_foo当我打印出来时看起来像这样:<__main__.Foo object at 0x0000029AAFC4C780>

当我打印出整个堆栈时,在其中找不到条目:

def baz():
    print(inspect.stack())
    return inspect.stack() #[1][3]

>>> [FrameInfo(frame=<frame object at 0x0000029AADB49648>, filename='return_caller.py', lineno=5, function='baz', code_context=['    print(inspect.stack())\n'], index=0), FrameInfo(frame=<frame object at 0x0000029AAD8F0DE8>, filename='return_caller.py', lineno=11, function='bar', code_context=['        return func()  # should return the Foo object but how???\n'], index=0), FrameInfo(frame=<frame object at 0x0000029AAD8AC588>, filename='return_caller.py', lineno=19, function='<module>', code_context=['new_foo_instance = new_foo.bar(baz)\n'], index=0)]

所以我不想让它返回 Foo 的新实例,但实际上与 new_foo 完全相同的实例.

最佳答案

使用检查:

import inspect

def baz():
    frame_infos = inspect.stack()  # A list of FrameInfo.
    frame = frame_infos[1].frame   # The frame of the caller.
    locs = frame.f_locals          # The caller's locals dict.
    return locs['self']

class Foo():
    def bar(self, func):
        return func()

f1 = Foo()
f2 = f1.bar(baz)
print(f1)
print(f2)
print(f2 is f1)  # True

或者作弊:

def baz():
    return getattr(baz, 'self', None)

class Foo():
    def bar(self, func):
        func.self = self  # Functions can be a place to store global information.
        return func()

关于python独立函数返回调用它的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53236931/

相关文章:

python - 将 3D 图的轴放置在图表内

python - 哪种数据结构适合这个?

python - 高效的numpy数组创建

c++ - 如何 boost::fusion::for_each 添加类型以创建类型的 mpl::vector?

python - 元类和何时/如何调用函数

c++ - 基本类型的模板特化

python - 使用 pandas.read_csv 设置标题

python - 从 pandas 数据帧的所有列和行中删除值

python - 如何检查函数是否在 Python 中是纯函数?

c++ - 您可以在指向不同模板类实例的指针之间进行转换吗?