【问题标题】:Method in dictionary is not defined字典中的方法未定义
【发布时间】:2023-03-16 00:40:01
【问题描述】:

我在字典中有一个方法作为类属性;

class parentClass(object):
    pass

class childClass(parentClass):
    a = {'meth': my_meth}

    def my_meth(self, var):
        print(var)

inp = input()
# User enters 'meth' 
childClass.a[inp]('test')

当我运行程序时出现错误;

NameError: name 'my_meth' 未定义

我读过函数是 python 中的一等公民。如何将方法分配为字典中的值,以便稍后使用某些参数调用它?

【问题讨论】:

  • 我不明白你想在这里实现什么。你为什么要抽象my_methchildClass.a['meth']('test')childClass.my_meth('test') 有什么好处?
  • 反正a是一个类属性。定义 a 时,self 不存在。
  • 功能取决于用户输入。这是根据 SO 指南的简化版本。
  • 很公平。在这种情况下有点过度简化。值得将您的最终目标添加到问题中。

标签: python dictionary methods


【解决方案1】:
class parentClass(object):
    pass

class childClass(parentClass):

    def __init__(self):

        self.a = {'meth': self.my_meth}

    def my_meth(self, var):
        print(var)


c = childClass()
c.a['meth']('test')

您必须在 __init__ 中定义实例变量。

【讨论】:

    【解决方案2】:

    您的代码的问题是您将 a 设置为类中的静态变量,但类中的方法不是静态的并且需要 self 参数。

    要解决这个问题,您可以通过在 __init__ 方法中设置 a 变量来连接实例:

    class parentClass(object):
        pass
    
    class childClass(parentClass):
    
        def __init__(self):
            self.a = {'meth': self.my_meth}
    
        def my_meth(self , var):
            print(var)
    
    childClass().a['meth']('Helloworld')
    

    或者 my_meth 可以设为静态,从而可以从类本身调用它,例如:

    class parentClass(object):
        pass
    
    class childClass(parentClass):
    
    
        def my_meth(var):
            print(var)
    
        a = {'meth': my_meth}
    
    x = childClass.a['meth']("Helloworld")
    

    【讨论】:

    • 问题其实是my_meth方法是在属性后面定义的。您将类的属性移到方法下方,现在我的代码可以工作了。为什么需要这个?
    • 所有方法在使用前都需要定义,类的主体是可执行的(意味着你可以在定义类时在其中运行代码),所以当你引用方法时,方法是尚未定义,导致错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2014-06-01
    相关资源
    最近更新 更多