1

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

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

    def __len__(self):
        return self.__size

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

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

4

2 回答 2

3

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

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


>>> len(Object(3))
3

我不推荐这样做的原因归结为 Python 之禅:显式优于隐式。简单胜于复杂。

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

于 2012-10-22T13:10:58.380 回答
2

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

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

这看起来令人困惑(因此可能会受到反对),但它确实有效。

它之所以有效__len__(),是因为作为def-ed 函数的类属性调用了实例属性__len__(),它是来自 的 lambda __init__()

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

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

于 2012-10-22T13:35:31.563 回答