1

count(vanilla)の代わりに書くことが可能かどうか疑問に思っていvanilla.count()ます ? に似てlen(list)いますが、やりたいですlen(myclass)。ユーザー定義クラスでこのように実装することは可能ですか? この質問をするために私が書いたダミークラスの下に。ありがとうございました。

    class IceCream():
    # Flavor is a string
    # Toppings is a list of strings
    def __init__(self, flavor, toppings, ):
        self.name = flavor
        self.toppings = toppings
    # Return the number of toppings
    def count(self):
        return len(self.toppings)
    def __str__(self):
        return "{0} flavor ice cream".format(self.name)


vanillaToppings = ['chocolate chips', 'fudge', 'penuts']
vanilla = IceCream('Vanilla', vanillaToppings)
print(vanilla, 'with', vanilla.count(), 'kind of toppings!')
# Is it possible? If so, how do I do it?
# print(vanilla, 'with', len(vanilla), 'kind of toppings!')
4

3 に答える 3

2

Python の特別なメソッドの 1 つを利用するのはどうですか: __len__?

組み込み関数 len() を実装するために呼び出されます。オブジェクトの長さ、整数 >= 0 を返す必要があります。

class IceCream():
    # Flavor is a string
    # Toppings is a list of strings
    def __init__(self, flavor, toppings):
        self.name = flavor
        self.toppings = toppings

    # Return the number of toppings
    def __len__(self):
        return len(self.toppings)

    def __str__(self):
        return "{0} flavor ice cream".format(self.name)


vanillaToppings = ['chocolate chips', 'fudge', 'penuts']
vanilla = IceCream('Vanilla', vanillaToppings)
print(vanilla, 'with', len(vanilla), 'kind of toppings!')

この場合、 countlengthの意味はある程度互換性があると思います。

于 2012-04-05T05:21:31.620 に答える
2

len()渡されたものの長さを取得する関数です。したがって、オブジェクトを渡されてそれをカウントする関数を書くことができますcount()(ただし、「カウント」を定義します)。

このlen()関数は__len__()、インスタンスで特別なメソッド を呼び出します。count()関数を使用したい人が、 で使用する独自のクラスに特別なメソッドを定義できるように、 に同様のインターフェイスを定義できますcount()。(先頭に 2 つ、末尾に 2 つのアンダースコアを付けて名前を付けないでください。これは Python 用に予約されています。先頭と末尾に 1 つのアンダースコアを付けることをお勧めします。) 次に、そのインターフェイスを独自のオブジェクトに実装します。

だから、このようなもの:

def count(obj):
    return obj._count_()

class IceCream(object):
    def _count_(self):
        return len(self.toppings)

miku は__len__()、クラスに実装して を使用することを提案していますlen()。これも優れたソリューションですが、他のコンテナーまたはイテレーター メソッドが使用可能であるという印象を与える可能性があります。

于 2012-04-05T05:23:53.350 に答える
1

実装できるマジック メソッドについては、 http://docs.python.org/reference/datamodel.htmlを参照してください。あなたが欲しいのはdef __len__(self): return len(self.toppings)

次にlen(yourinstance)、その関数の戻り値を取得するために使用できます。

ただし、これを行うことはできませcount(yourinstance)ん。少なくともきれいな方法ではありません。


非クリーンな方法は次のとおりです。

def count(instance):
    return instance.count()

などの公式の python 用に予約されていると見なされるため、使用__count__していません。とにかく、数行上の水平線より下のすべてを忘れてください - あなたは本当にこれをしたくありません. それに使用します。__*____len____len__

于 2012-04-05T05:40:31.207 に答える