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
,那是我的事。
我有一些 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
,那是我的事。