如何在__init__上创建__len__函数?

时间:2012-10-22 13:07:22

标签: python object python-3.x python-2.7

如何删除此对象中的__size属性?

class Object():
    def __init__(self, size):
        self.__size = size

    def __len__(self):
        return self.__size

init函数如何创建len函数? Lambda函数?

PS:在我的实际情况中,我在这个len函数中有一些计算要做,但是在实例化之后结果总是相同的(比如一个元组)。将此结果保存在没有任何隐藏属性的函数中可能会很棒。

2 个答案:

答案 0 :(得分:3)

我不推荐这个,但你可以使用一个简单的lambda函数

class Object():
    def __init__(self, size):
        self.__len__ = lambda: size


>>> len(Object(3))
3

我不推荐这个的原因在Python的Zen中有所体现:明确比隐含更好。简单比复杂更好。

如果您正在使用实例变量,那么它是显式的,您有更好的堆栈跟踪错误,您可以在__len__函数中使用doctests,并且在阅读和更新代码时更容易理解。

答案 1 :(得分:2)

由于无法让__len__成为实例属性以便通过len()使用,因此必须在类中定义它。但由于没有其他限制,您可以定义实例属性__len__,以便您的命名空间不会受到污染。

class MyObject(object):
    def __init__(self, size):
        self.__len__ = lambda: size
    def __len__(self):
        return self.__len__()

这看起来令人困惑(并且因为这可能已被磨损),但它确实有效。

它的作用是因为作为__len__() ed函数的类属性def调用实例属性__len__(),它是来自__init__()的lambda。

在展示了可能的内容之后,我不推荐它,因为它可能非常令人困惑。

您的原始解决方案要好得多。