Python 调用类中的嵌套函数
我正在测试一个小功能,其中Python 调用类中的嵌套函数,python,python-3.x,Python,Python 3.x,我正在测试一个小功能,其中manage()函数在barbar中调用call\u central,该函数具有函数call2和call3。 我希望在call\u central上有一个对象,以便在需要时调用call2和call3 一些背景:我打算做的是。在我的程序中,call2正在实例化另一个类,而call3正在使用此信息执行各种其他操作 编辑:更多详细信息: 我创建嵌套函数的基础如下。让我们假设您正在尝试执行一些调度工作并测试各种调度程序。barbar函数将从您要实现的“所有”调度算法中获取所有参
manage()
函数在barbar
中调用call\u central
,该函数具有函数call2和call3。
我希望在call\u central
上有一个对象,以便在需要时调用call2
和call3
一些背景:我打算做的是。在我的程序中,call2正在实例化另一个类,而call3正在使用此信息执行各种其他操作
编辑:更多详细信息:
我创建嵌套函数的基础如下。让我们假设您正在尝试执行一些调度工作并测试各种调度程序。barbar函数将从您要实现的“所有”调度算法中获取所有参数。每个调度算法本身都有类。在这个MWE中,它被称为ThisClass。“call_central”所做的是在call2中实例化这个特定的调度算法,并使用它在call3中实际调度
有几个问题:
s(self.call2()
返回None
你在这里做了一些很奇怪的事情,但我会尽力给出一些合理的答案 为什么它要求我把“自我”作为一个论点。 您的代码如下所示:
def manage(self):
FUNCTIONS = globals()['barbar']
s = getattr(FUNCTIONS, "call_central")
print (s(self))#.call2())
def call2():
self.invoke_callthisclass = CallThisClass()
print ("do nothing from call2")
def call3():
self.invoke_callthisclass.do_something_here()
print ("do nothing from call3")
return 0
您可以等效地编写s=barbar.call\u central
,而不是通过globals
dictbarbar.call_central
是一种未绑定的方法。这意味着它是一个实例级方法,没有任何实例可供调用
为了快速了解Python中对象的工作方式,让我们讨论一个更简单的类:
class Foo(object):
def bar(self):
pass
f = Foo()
print(Foo.bar) # => "<unbound method Foo.bar>"
print(f.bar) # => "bound method Foo.bar of <__main__.Foo object at 0x...>>"
没有返回
,执行只是从末尾开始。当执行从函数末尾退出时,它返回None
你写过这样的东西:
def manage(self):
FUNCTIONS = globals()['barbar']
s = getattr(FUNCTIONS, "call_central")
print (s(self))#.call2())
def call2():
self.invoke_callthisclass = CallThisClass()
print ("do nothing from call2")
def call3():
self.invoke_callthisclass.do_something_here()
print ("do nothing from call3")
return 0
因为您没有参与,所以离开了call2
的作用域,因此以下几行都与该函数没有特别的关系。值得指出的是,call3
也不会返回0
,因为您的在这里做某事
方法永远不会返回
有没有办法避免为此使用嵌套函数?
据我所知,你的问题似乎就是你想做的:
class BaseScheduler(object):
def do_the_thing(self):
raise NotImplementedError("bla bla bla please define a method in {}", type(self))
class Scheduler1(BaseScheduler):
pass
class Scheduler2(BaseScheduler):
pass
class BarBarOrWhatever(object):
def __init__(self, scheduler_cls):
avaialble_schedulers = BaseScheduler.__subclasses__()
# Iterate over available_schedulers and do whatever setup you wanted here
self.__scheduler = scheduler_cls()
self.__scheduler.do_the_thing()
BarBarOrWhatever(Scheduler1)
您说过希望\uuuu init\uuuu
方法对所有可用的调度程序执行某些操作,所以\uuu subcasses\uuuu
位就是这样做的。请参阅:. 希望其他一切都相当简单。您在这里想要实现什么?为什么不
管理
只打印(self.call_central())
?因为有多个这样的函数。还有call\u central1
,这是通过字符串确定的。那么为什么不在实例self
上使用getattr
,而不是类呢?如果您确实想在类上执行此操作,为什么要通过globals
而不是通过名称访问它?在方法调用中定义函数也没有多大用处;您从不调用它们,并且在调用完成后无法访问它们。您是否建议在manage()函数中创建另一个类的实例,并避免使用“call2”altogther?您的MWE仍然不清楚。你基本上想要完成什么?最初是什么样的推理使您相信首先需要嵌套这样的函数?谢谢您的解释。在问题1中添加了更多细节问题:如果scheduler1
的所有功能都在的范围内,为什么我需要迭代可用的调度程序?另外,传递Scheduler1(BaseScheduler)
有什么作用?@tandem您说过“barbar函数将从“所有”您将要实现的调度算法中获取所有参数”。如果您想对所有实现的调度器做些什么,您将需要类似于\uu子类\uu
的调用。如果这不是您的实际需求,那么您可以跳过这一点<代码>Scheduler1(BaseScheduler)
只是类继承。您应该在这里阅读: