【问题标题】:NameError: name 'self' is not definedNameError:名称“自我”未定义
【发布时间】:2010-12-20 15:39:20
【问题描述】:

为什么会有这样的结构

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

给出错误NameError: name 'self' is not defined?

【问题讨论】:

    标签: python nameerror


    【解决方案1】:

    默认参数值在函数定义时进行评估,但self 是仅在函数调用时可用的参数。因此,参数列表中的参数不能相互引用。

    将参数默认为None 并在代码中添加测试是一种常见模式:

    def p(self, b=None):
        if b is None:
            b = self.a
        print b
    

    【讨论】:

    • 虽然我认为上面的内容不是很漂亮(我来自 ruby​​ 工作正常的地方),但上面的内容实际上是一种解决方法。 python选择让self在参数列表中不可用还是很尴尬的。
    • @shevy: "self" 在 python 中没有特殊含义,它只是常规为第一个参数选择的名称。您也可以将“self”替换为“me”或“x”。
    • 没有更好的方法吗?如果我们有一个函数需要十几个应该引用 self 的默认参数,我们真的需要十几个 if 语句吗?这太尴尬了。
    • 如果调用者显式为第二个参数传入None,它会被self.a覆盖,这是出乎意料和令人惊讶的。
    【解决方案2】:

    如果您还希望有将“b”设置为无的选项:

    def p(self, **kwargs):
        b = kwargs.get('b', self.a)
        print b
    

    【讨论】:

      【解决方案3】:

      如果您是通过 google 到达这里的,请确保检查您是否已将 self 作为类函数的第一个参数。特别是如果您尝试在类函数中引用该对象实例的值。

      def foo():
          print(self.bar)
      

      >NameError: name 'self' 未定义

      def foo(self):
          print(self.bar)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        • 2019-01-26
        • 2021-10-05
        • 2017-08-16
        相关资源
        最近更新 更多