在 public 和 Python 中的私有方法之间进行重构
Refactoring between public and private methods in Python
我正在查看教程 "Problem Solving with Algorithms and Data Structures" 中的二叉搜索树部分,(http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html)。在某些情况下,他们使用同名的 "public" 和 "private" 辅助方法,例如对于 "put" 方法:
def put(self,key,val):
if self.root:
self._put(key,val,self.root)
else:
self.root = TreeNode(key,val)
self.size = self.size + 1
def _put(self,key,val,currentNode):
if key < currentNode.key:
if currentNode.hasLeftChild():
self._put(key,val,currentNode.leftChild)
else:
currentNode.leftChild = TreeNode(key,val,parent=currentNode)
else:
if currentNode.hasRightChild():
self._put(key,val,currentNode.rightChild)
else:
currentNode.rightChild = TreeNode(key,val,parent=currentNode)
我在其他地方也看到过这种方法,但我不太明白其动机。与直接将所有内容放在一个方法中相比有什么优势,是否只是为了提高可读性?
理由是 class 的用户不应该对 "current node" 有任何了解。当前节点仅在递归插入过程中才有意义,它不是树的永久属性。用户将树视为一个整体,并且只对其进行 insert/lookup 操作。
就是说,您 可以 将两种方法合二为一,方法是使用默认值 currentNode=None
并检查它。但是,这两种方法做的事情截然不同。 put
方法只是初始化根,而 _put
进行递归插入,所以最好将它们分开。
在这里,动机是使用递归。您可能已经注意到,_put
方法调用自身并且方法签名不同。如果将 _put
方法放入 public 方法中,则必须更改 public 方法的签名以处理给定节点上的放置操作。简单地说,您必须添加 currentNode
参数。但是,原来的public方法没有这个参数。我想,这是因为作者不想向最终用户公开此功能。
我正在查看教程 "Problem Solving with Algorithms and Data Structures" 中的二叉搜索树部分,(http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html)。在某些情况下,他们使用同名的 "public" 和 "private" 辅助方法,例如对于 "put" 方法:
def put(self,key,val):
if self.root:
self._put(key,val,self.root)
else:
self.root = TreeNode(key,val)
self.size = self.size + 1
def _put(self,key,val,currentNode):
if key < currentNode.key:
if currentNode.hasLeftChild():
self._put(key,val,currentNode.leftChild)
else:
currentNode.leftChild = TreeNode(key,val,parent=currentNode)
else:
if currentNode.hasRightChild():
self._put(key,val,currentNode.rightChild)
else:
currentNode.rightChild = TreeNode(key,val,parent=currentNode)
我在其他地方也看到过这种方法,但我不太明白其动机。与直接将所有内容放在一个方法中相比有什么优势,是否只是为了提高可读性?
理由是 class 的用户不应该对 "current node" 有任何了解。当前节点仅在递归插入过程中才有意义,它不是树的永久属性。用户将树视为一个整体,并且只对其进行 insert/lookup 操作。
就是说,您 可以 将两种方法合二为一,方法是使用默认值 currentNode=None
并检查它。但是,这两种方法做的事情截然不同。 put
方法只是初始化根,而 _put
进行递归插入,所以最好将它们分开。
在这里,动机是使用递归。您可能已经注意到,_put
方法调用自身并且方法签名不同。如果将 _put
方法放入 public 方法中,则必须更改 public 方法的签名以处理给定节点上的放置操作。简单地说,您必须添加 currentNode
参数。但是,原来的public方法没有这个参数。我想,这是因为作者不想向最终用户公开此功能。