【问题标题】:Python: variables, inheritance, and default argumentsPython:变量、继承和默认参数
【发布时间】:2012-03-06 21:14:29
【问题描述】:

我想我对Python中“类”和“继承”的用法有一些误解。我将我的问题简化如下:

class A:
    def __init__(self):
        self.data = 100

class B(A):
    def b(self):
        print self.data

>>>B().b()
>>>100

好的,到目前为止一切顺利。但是,如果我创建另一个类,就会出错,如下所示:

class C(A):
    def c(self, num=self.data):
        print self.data

>>>C().c()
NameError: name 'self' is not defined

我想将'num'的默认值设置为self.data,即'100'。没有'class',它会简单得多:

data = 100
def d(num = data):
    print num

>>>d()
>>>100

我已经用谷歌搜索了一些文章,但仍然陷入这个问题...... 提前致谢!

【问题讨论】:

    标签: python class variables inheritance self


    【解决方案1】:

    当你这样做时:

    class C(A):
        def c(self, num=self.data):
            print self.data
    

    你正在做类似的事情:

    >>> def d(num, data=num):
    ...     print(num, data)
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'num' is not defined
    

    如您所见,python 编译器不知道第二个 num 是什么。

    但是没有什么能阻止你做这样的事情:

    class C(A):
        def c(self, num=None):
            print num or self.data
    

    或使用明确的None 检查:

    class C(A):
        def c(self, num=None):
            if num is None:
                num = self.data
            print num
    

    【讨论】:

    • 太棒了!对此,我真的非常感激!这正是我想要的!谢谢!
    【解决方案2】:

    这与继承无关。你可以尝试在基类A 中做同样的事情,它会以同样的方式失败。

    为了实现你想要的,只需做:

    def c(self, num=None):
        if num is None:
            num = self.data
    

    【讨论】:

      【解决方案3】:

      函数参数默认值是在定义函数时评估的,而不是在调用它时评估的。在定义时,没有名称self

      最好的当然是使用 None 作为默认值,然后在函数中使用逻辑来解释它的含义:

      class C(A):
          def c(self, num=None):
              if num is None:
                  num = self.data
              #.. the rest of the function ..
      

      【讨论】:

        【解决方案4】:

        你误解了类方法。类方法被隐式传递给 self。自我不存在def c(self, num=HERE&gt;&gt;&gt;&gt;&gt;self&lt;&lt;&lt;&lt;&lt;HERE.data):

        你为什么想做你正在做的事?

        【讨论】:

          【解决方案5】:
          class C(A):
              def c(self,data=None):
                  if data == None:
                      print self.data
                  else 
                      print data 
          

          你的类的方法获取参数, 你不能通过 self.something。

          【讨论】:

            【解决方案6】:

            如前所述,您不能像那样使用“self”变量。如果您以后不必更改数据的值,则可以执行以下操作:

            class A:
                data = 100
            
            class C(A):
                def me(self, num=A.data):
                    print num
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-09
              • 2019-10-08
              • 2020-03-27
              • 2013-02-11
              相关资源
              最近更新 更多