我需要一个Python类来跟踪它实例化的次数

Blo*_*nor 4 python class instances

我需要一个像这样工作的类:

>>> a=Foo()
>>> b=Foo()
>>> c=Foo()
>>> c.i
3
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

class Foo(object):
    i = 0
    def __init__(self):
        Foo.i += 1
Run Code Online (Sandbox Code Playgroud)

它按要求工作,但我想知道是否有更多的pythonic方法来做到这一点.

Pao*_*ino 13

不.那很不错.

来自Python的禅宗:"简单比复杂更好."

这很好,并且清楚你正在做什么,不要复杂化.也许可以说出它的名称counter,但除此之外,你就像pythonic一样好.


eph*_*ent 5

滥用装饰器和元类.

def counting(cls):
    class MetaClass(getattr(cls, '__class__', type)):
        __counter = 0
        def __new__(meta, name, bases, attrs):
            old_init = attrs.get('__init__')
            def __init__(*args, **kwargs):
                MetaClass.__counter += 1
                if old_init: return old_init(*args, **kwargs)
            @classmethod
            def get_counter(cls):
                return MetaClass.__counter
            new_attrs = dict(attrs)
            new_attrs.update({'__init__': __init__, 'get_counter': get_counter})
            return super(MetaClass, meta).__new__(meta, name, bases, new_attrs)
    return MetaClass(cls.__name__, cls.__bases__, cls.__dict__)

@counting
class Foo(object):
    pass

class Bar(Foo):
    pass

print Foo.get_counter()    # ==> 0
print Foo().get_counter()  # ==> 1
print Bar.get_counter()    # ==> 1
print Bar().get_counter()  # ==> 2
print Foo.get_counter()    # ==> 2
print Foo().get_counter()  # ==> 3
Run Code Online (Sandbox Code Playgroud)

你可以通过经常使用双重强制名称来告诉它是Pythonic.(开玩笑,开玩笑......)