【问题标题】:A python method without self as the first parameter一个没有self作为第一个参数的python方法
【发布时间】:2019-11-07 08:49:52
【问题描述】:

我看到这个问题已被多次询问,并将被标记为重复。然而,我没有看到正确的答案。

我了解在使用 OOPS 概念时,对象的实例作为第一个参数发送。然而,在解决一些算法时,我看到一些没有self 定义的方法,这让我很困惑。

谁能解释一下这里发生了什么,而不是为什么使用self

class Solution:
        def __init__(self):
            self.ans=0

        def countUnivalSubtrees(self, root: TreeNode) -> int:
            if not root:
                return 0


            def chk(node):
                if node is None:
                    return -1
                if node.left is None and node.right is None:
                    self.ans+=1
                    return True
                l=chk(node.left)
                r=chk(node.right)
                if node.left and node.right:
                    if node.left.val==node.right.val and l and r and node.val==node.left.val:
                        self.ans+=1
                        return True
                if l==-1 and r and node.val==node.right.val:
                    self.ans+=1
                    return True
                if r==-1 and l and node.val==node.left.val:
                    self.ans+=1
                    return True
                return False

            self.ans=0
            chk(root)        
            return self.ans

我这里指的方法是chk(node)

【问题讨论】:

  • chk 不是一种方法。
  • @user2357112:你能多说一些吗?那么,这是否意味着您可以在类中定义一个函数并使用它?我从来没有这样用过。
  • chk 是类的 method 内的一个函数。方法通常由obj.method() 调用,其中obj 是类的实例,它通过self 传递给方法。如果你注意到chk是如何被调用的,你会发现它没有在任何对象上调用,它只有一个参数节点,它可以独立运行。
  • chk 是在countUnivalSubtrees 中定义的函数。你可以这样做。 Python 函数定义和其他任何语句一样是普通语句;它们可以出现在您可以放置​​任何其他类型声明的任何地方。
  • 搜索“作用域”的术语,特别是“词法作用域”。有关介绍,请参阅 here。特别是self 被封闭范围绑定,因此变量在chk 中可用

标签: python python-3.x oop


【解决方案1】:

chk 只是方法内部的函数: 你可以这样重写你的类:

class Solution:
    def __init__(self):
        self.ans=0

    def countUnivalSubtrees(self, root: TreeNode) -> int:
        if not root:
            return 0
        self.ans = 0
        self.chk(root)        
        return self.ans

    def chk(self, node):
        if node is None:
            return -1
        if node.left is None and node.right is None:
            self.ans += 1
            return True
        l = self.chk(node.left)
        r = self.chk(node.right)
        if node.left and node.right:
            if node.left.val == node.right.val and l and r and node.val == node.left.val:
                self.ans += 1
                return True
        if l == -1 and r and node.val == node.right.val:
            self.ans += 1
            return True
        if r == -1 and l and node.val == node.left.val:
            self.ans += 1
            return True
        return False

【讨论】:

  • 我认为这会有所不同。 OPs 版本中的 self 将始终引用同一个对象,而此版本在每次递归到节点时都会更改它
  • 哎呀,我误读了这个正在定义/调用的对象。不知何故,我把它读成每个node 都有一个ans,而不是Solutions,这会导致很多部分小计
猜你喜欢
  • 2011-10-02
  • 2012-12-28
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2017-06-15
  • 2018-03-09
  • 2012-10-04
相关资源
最近更新 更多