Python:覆盖len

时间:2016-12-22 05:43:52

标签: python

我对以下方法有疑问。 __len__()。这是初步的,但我很困惑。

class PriorityQueue:

    def __init__(self):
        self.heap = [None]

    def __len__(self):
        print('len is: ', len(self.heap) - 1)
        return len(self.heap) - 1
    def print_len(self):
        print(len(self.heap))

new = PriorityQueue()

如果我使用len(new),那么它产生0,而调用方法print_len()会产生1.

这是否意味着类中的方法不使用类中的__len__方法(覆盖len())并使用python定义的len()函数?

1 个答案:

答案 0 :(得分:3)

你正在检查两件事。当你打电话

len(new)

Python真的叫

type(new).__len__(new)

__len__的实施过程中,检查self.heap的长度并减去1,得出0的长度。

致电时

new.print_len()

您不是致电len(self)而是致电len(self.heap)1)。如果您更改了实现以调用前者而不是后者,那么您将获得0而不是1