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的一种特殊方法怎么样:__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!')

我猜想在这种情况下计数长度的含义是可以互换的,那么为什么不使用熟悉的东西呢?

于 2012-04-05T05:21:31.620 回答
2

len()是一个函数,它获取传递的任何内容的长度。因此,您可以编写一个count()传递对象并对其进行计数的函数(但是您定义“计数”)。

len()函数调用__len__()实例上的特殊方法 。你可以定义一个类似的接口,count()以便那些想要使用你的函数的人可以在他们自己的类上定义一个特殊的方法供count(). (不要用两个前导和两个尾随下划线命名它;这是为 Python 保留的。我建议使用单个前导和尾随下划线。)然后您只需在自己的对象上实现该接口。

所以是这样的:

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()

我没有使用__count__as__*__被认为是为官方 python 保留的东西,例如__len__. 但是无论如何,请忘记水平线以下几行的所有内容-您真的不想这样做。__len__为之使用。

于 2012-04-05T05:40:31.207 回答