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
    dict
    barbar.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)
    只是类继承。您应该在这里阅读: