ID 生成器:class 变量 vs while yield

ID generator: class variable vs while yield

我有一些 class 可以在创建时为每个实例提供唯一的 ID。我可以通过两种方式之一来做到这一点,但不知道哪种方式更好。第一种方法是使用 class 变量和 class 方法来设置 ID。用户可能会通过调用 SomeClass.unique_id = something 之类的东西来解决这个问题,但这不太可能。第二种方法是使用带有 yield 和无限 while 循环的静态方法。我在下面展示了这两种方法(请注意,为了示例目的,这两种方法仅具有相同的名称)。

class SomeClass():
    
    def __init__(self, *args, **kwargs):
        self.id = self.generate_id()

    # Method 1:
    unique_id = 0
    @classmethod
    def generate_id(cls):
        cls.unique_id += 1
        return cls.unique_id

    # Method 2:
    @staticmethod
    def generate_id():
        unique_id = 0
        while True:
            unique_id += 1
            yield unique_id

哪种方法更适合在我的代码中使用?

考虑使用 itertools.count(),它的工作原理基本上类似于您的生成器函数:

import itertools 
class SomeClass:
    id_counter = itertools.count()

    def __init__(self):
        self.id = next(self.id_counter)


a, b = SomeClass(), SomeClass()
print(a.id)  # output: 0
print(b.id)  # output: 1

用户通过编写 a.id = 'banana' 之类的东西来弄乱您的唯一 ID 值的问题是另一个问题,并且或多或少是 Python 的灵​​活性所固有的,尽管您无法真正停止他们这样做。如果我写 np.array = list,那是我的事。