【发布时间】: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