Метод python без self в качестве первого параметра - PullRequest
2 голосов
/ 07 ноября 2019

Я видел, что этот вопрос задавался несколько раз и будет отмечен как дубликат. Тем не менее, я не вижу правильного ответа.

Я понимаю, что при использовании концепции 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).

1 Ответ

2 голосов
/ 07 ноября 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...