Python:如何在另一个类中调用函数

时间:2018-07-19 09:35:32

标签: python function class

我坚持在https://python4kids.brendanscott.com/2014/12/02/hooking-up-the-sunfish-chess-engine-advanced/找到的一些Python脚本:我按照Brendan Scott的指示,并按照他的描述构建了Python脚本,以获取sunfish.py的TKinter GUI,这是一个不错的工具国际象棋应用程序。尽管他的文章和说明很清楚并且设置正确,但是代码中仍然包含一些错误。

首先,这产生了“ KeyError”错误:

def location_to_algebraic(board_location):
    return "%s%s"%(ALGEBRAIC_DICT[7-board_location.j],8-board_location.i)

我可以通过以下方式简单解决:

def location_to_algebraic(board_location):
    return "%s%s"%(ALGEBRAIC_DICT[math.ceil(7-board_location.j)],math.ceil(8-board_location.i))

说明:用户在棋盘正方形上某处单击的屏幕上的点似乎给出了x,y浮点数,而期望整数,因为它们是字典的索引。仅仅通过使用math.ceil()进行四舍五入,我们得到了正确的整数,并且它可以按预期工作。奇怪,看来作者没有测试最终脚本。

但是此脚本中的另一个(简单?)错误我无法解决:

move, score = sunfish.search(pos)

给出此错误: AttributeError:模块'sunfish'没有属性'search'

似乎search()函数未正确调用,尽管它确实存在于模块“ sunfish”中:位于其类“ Searcher”中。所以我尝试通过以下方式修复它:

move, score = sunfish.Searcher.search(pos)

但是然后我又得到一个错误:

TypeError:search()缺少2个必需的位置参数:“ pos”和“ secs”

现在调用了search()函数,但是参数很少!当我尝试通过以下方式解决此问题:

move, score = sunfish.Searcher.search(pos, secs=2)

我遇到另一个错误:

TypeError:search()缺少1个必需的位置参数:“ pos”

我现在卡住了.. 这是sunfish.Searcher类中的相关搜索功能,非常简单:

def search(self, pos, secs):
    start = time.time()
    for _ in self._search(pos):
        if time.time() - start > secs:
            break
    return self.tp_move.get(pos), self.tp_score.get((pos, self.depth, True)).lower

如何正确调用search()?

Searcher类的 init 如下:

class Searcher:
    def __init__(self):
        self.tp_score = LRUCache(TABLE_SIZE)
        self.tp_move = LRUCache(TABLE_SIZE)
        self.nodes = 0

1 个答案:

答案 0 :(得分:1)

sunfish.Searcher.search()函数带有3个参数,第一个变量是self,它引用该类的当前实例。因此,当您在不创建sunfish.Searcher对象的情况下调用搜索函数时,将不会自动提供self变量,并且self获取pos的值,而secs获取2的值。

要解决此问题,您需要先创建一个sunfish.Searcher对象,然后通过该对象调用搜索功能。

示例:-

Obj = sunfish.Searcher()
Obj.search(pos, secs)

这里有一篇文章,清楚地解释了python中类和对象的概念:- https://www.programiz.com/python-programming/class