1

__sizeこのオブジェクトの属性を削除するにはどうすればよいですか?

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

    def __len__(self):
        return self.__size

init関数はどのようにしてlen関数を作成できますか?ラムダ関数?

PS:私の実際のケースでは、このlen関数で実行する計算がいくつかありますが、インスタンス化後の結果は常に同じです(たとえば、タプルのように)。この結果を非表示の属性のない関数に保存すると便利な場合があります。

4

2 に答える 2

3

これはお勧めしませんが、単純なラムダ関数を使用できます

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


>>> len(Object(3))
3

私がこれをお勧めしない理由は、PythonのZenに含まれています。明示的は暗黙的よりも優れています。単純な方が複雑な方が優れています。

インスタンス変数を使用している場合、それは明示的であり、エラーのスタックトレースが優れており、__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__()が、からのラムダであるインスタンス属性を呼び出すために機能します__init__()

何が可能かを示したので、非常に混乱する可能性があるため、お勧めしません。

元のソリューションの方がはるかに優れています。

于 2012-10-22T13:35:31.563 に答える