python 独立函数 return 调用它的对象实例
python standalone function return object instance that called it
我有一个很奇怪的问题。
我需要 return 一个 class 对象来调用一个函数,该函数应该 return 调用它的 class 对象。我知道我知道。只是把它当作一个人为的练习,虽然对我来说这是一个非常真实的需要。
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()
中写入任何内容,return 调用它的对象?
编辑:
回复评论:
我尝试使用 inspect,但没有成功,我什至查看了整个堆栈,但找不到与 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)]
所以我不是想把它变成 return 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()
以上答案很完美,这是满足您需求的另一种方式。
import sys
import inspect
def baz():
"""
Return the object instance whose method calls me
"""
for item in dir(sys.modules[__name__]):
elem = eval(item)
if inspect.isclass(elem):
foo_instance = elem()
break
return foo_instance
class Foo():
"""
Foo class
"""
def bar(self, func):
return func() # should return the Foo object but how???
# Instantiation and calling
new_foo = Foo()
new_foo_instance = new_foo.bar(baz)
print(new_foo_instance) # <__main__.Foo object at 0x0000015C5A2F59E8>
print(type(new_foo_instance)) # <class '__main__.Fo
# E:\Users\Rishikesh\Projects\Python3\try>python Get_caller_object_final.py
# <__main__.Foo object at 0x0000015C5A2F59E8>
# <class '__main__.Foo'>
参考 ”
- How can I get a list of all classes within current module in Python?
- Python: get only classes defined in imported module with dir()?
我有一个很奇怪的问题。
我需要 return 一个 class 对象来调用一个函数,该函数应该 return 调用它的 class 对象。我知道我知道。只是把它当作一个人为的练习,虽然对我来说这是一个非常真实的需要。
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()
中写入任何内容,return 调用它的对象?
编辑:
回复评论:
我尝试使用 inspect,但没有成功,我什至查看了整个堆栈,但找不到与 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)]
所以我不是想把它变成 return 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()
以上答案很完美,这是满足您需求的另一种方式。
import sys
import inspect
def baz():
"""
Return the object instance whose method calls me
"""
for item in dir(sys.modules[__name__]):
elem = eval(item)
if inspect.isclass(elem):
foo_instance = elem()
break
return foo_instance
class Foo():
"""
Foo class
"""
def bar(self, func):
return func() # should return the Foo object but how???
# Instantiation and calling
new_foo = Foo()
new_foo_instance = new_foo.bar(baz)
print(new_foo_instance) # <__main__.Foo object at 0x0000015C5A2F59E8>
print(type(new_foo_instance)) # <class '__main__.Fo
# E:\Users\Rishikesh\Projects\Python3\try>python Get_caller_object_final.py
# <__main__.Foo object at 0x0000015C5A2F59E8>
# <class '__main__.Foo'>
参考 ”
- How can I get a list of all classes within current module in Python?
- Python: get only classes defined in imported module with dir()?