【问题标题】:How to call a function from an object within a class?如何从类中的对象调用函数?
【发布时间】:2022-01-15 05:16:36
【问题描述】:

代码片段。

class foo:
    def __init__(self, items):
        self.myObj = {
        "item one": self.functionOne(),
        "item two": self.functionTwo()
        }
        self.__handler()

    def __handler(self):
        for item in items:
            if item in self.myObj.keys():
                self.myObj[item]

    def functionOne(self):
        # do stuff

    def functionTwo(self):
        # do stuff

问题。我试图在不使用 if 语句的情况下调用正确的函数。运行此代码的结果是:functionX 接受 0 个位置参数,但给出了 1 个。

期望的结束状态。在类内部使用对象调用正确的函数。或指导是否有更好的方法来做到这一点。

更大的图景。我希望通过的项目计数会定期更改。我想确保我的处理程序可以在不修改现有代码的情况下管理增加或减少(在 myObj 的范围内)。

备用计划。如果我试图完成的事情是不可能的,我正在考虑将类 foo 导入到调用 foo 的更高级别的类中。然后传递一个已映射函数的对象。如果有人可以阐明这种替代方案,以防我想要的最终状态是不可能的。

编辑。

  1. 忘记在构造函数中添加处理程序调用。
  2. 更正了缩进和函数定义。
  3. 添加了注释解决方案(感谢 kpie)。

kpie 的解决方案。

class foo:
    def __init__(self, items):
        self.myObj = {
        "item one": self.functionOne, # removed () from original
        "item two": self.functionTwo # removed () from original
    }
    self.__handler(items)

    def __handler(self,items):
        for item in items:
            if item in self.myObj.keys():
                self.myObj[item]() # added () from original

    def functionOne(self):
        print("bar")

    def functionTwo(self):
        print("baz")

foo(["item one"]) # example test (1) item, output: bar
foo(["item two","item one"]) # example test (2) items, output: baz, bar

【问题讨论】:

  • 请修正代码的缩进和函数定义,当我们无法正确看到您的实际代码时很难提供帮助:-)
  • @Bharel 已更正,感谢您的理解。

标签: python function class object method-call


【解决方案1】:

没有什么能阻止您将函数存储在字典中以供查找。这是一个显示正确语法的示例。

class foo:
    def __init__(self, items):
        self.myObj = {
        "item one": self.functionOne,
        "item two": self.functionTwo
        }
        self.__handler(items)
    def __handler(self,items):
        for item in items:
            if item in self.myObj.keys():
                self.myObj[item]()
    def functionOne(self):
        print("bar")
    def functionTwo(self):
        print("baz")

foo(["item one"])
foo(["item two","item one"])

打印:

bar
baz
bar

【讨论】:

  • 谢谢,这解决了问题:(1)从字典中删除(),(2)在[item]末尾使用()作为self.myObj[item]()在您的示例中注明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2018-10-25
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多