【问题标题】:Why does removing 'self' cause an error when my input is valid?当我的输入有效时,为什么删除“自我”会导致错误?
【发布时间】:2021-05-18 11:40:36
【问题描述】:

我有一个关于类和“自我”的相对基本的问题,虽然我在研究后知道它们是用来做什么的——但我仍然不太了解一些实际的实现。

我的问题:

  1. 最后一行代码没有定义“自我”。这是为什么呢?

  2. 我已经看到在 post-order_traversal_iterative 的函数中我会执行 self.root 的情况,但在其他情况下它只是 root。 我知道 class 的目的是让我们可以在同一个类中但在不同的函数中引用变量和其他东西,这就是我们将使用 self.root 的地方 - 对吗?

  3. 考虑到 2。我认为我们根本不需要“自我”。但是当我把所有的自我都拿出来时,我的输入 [1,None,2,3] 得到了一个意想不到的论据

     class Treenode:
         def __init__(self,val=0, left=None, right=None):
             self.val = val
             self.left = left
             self.right = right
    
     class Solution:
         def post_order_traversal_iterative(self,root):
             stack = [root]
             output = []
             if not root:
                 return []
             while stack:
                 curr = stack.pop()
                 output.append(curr.val)
                 if curr.right:
                     stack.append(curr.left)
                 if curr.left:
                     stack.append(curr.right)
             return output
    
     x = Solution()
     print(x.post_order_traversal_iterative(self,[1, None, 2, 3]))
    

【问题讨论】:

  • 问题,函数中的root 应该是Treenode 而不是列表?
  • 医生,我不太明白。在上面的代码中,root 应该是一个 Treenode。特别是树的第一个/顶部节点
  • 我的意思是打电话给print(x.post_order_traversal_iterative(Treenode(1, None, 2, 3)) 因为[1, None, 2, 3] 是一个列表而不是Treenode

标签: python class self


【解决方案1】:

你没有在课堂外提到self。 Python 在实例方法的后台为您使用它。

你创建了一个x,它允许你像这样调用实例方法x.post_order_traversal_iterative([1, None, 2, 3])

(想想这就像Solution.post_order_traversal_iterative(x, [1, None, 2, 3]

【讨论】:

  • 谢谢医生——在什么情况下我需要使用 self?对于所有代码,是否可以避免使用它?
  • 类内部当你想引用实例变量时
猜你喜欢
  • 1970-01-01
  • 2015-11-29
  • 2020-11-16
  • 1970-01-01
  • 2022-08-09
  • 2011-09-26
  • 2010-09-05
  • 2013-10-19
  • 1970-01-01
相关资源
最近更新 更多