如何删除此对象中的__size
属性?
class Object():
def __init__(self, size):
self.__size = size
def __len__(self):
return self.__size
init函数如何创建len函数? Lambda函数?
PS:在我的实际情况中,我在这个len函数中有一些计算要做,但是在实例化之后结果总是相同的(比如一个元组)。将此结果保存在没有任何隐藏属性的函数中可能会很棒。
答案 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。
在展示了可能的内容之后,我不推荐它,因为它可能非常令人困惑。
您的原始解决方案要好得多。