2 回答

TA貢獻1789條經驗 獲得超8個贊
這里最簡單的方法是一個類變量,它存儲下一個要使用的值,在使用后遞增:
class BankAccount:
_nextnum = 1
def __init__(self, balance):
self.account_number = "B" + str(self._nextnum)
type(self)._nextnum += 1 # Must set it on the class, or you only make a shadowing instance attribute
self.balance = balance
但是,如果沒有鎖定,這不是線程安全的,因此如果您想要線程安全,itertools.count可以以線程安全(至少在 CPython 上)的方式完成相同的工作:
import itertools
class BankAccount:
_numgenerator = itertools.count(1)
def __init__(self, balance):
self.account_number = "B" + str(next(self._numgenerator))
self.balance = balance
由于itertools.count的工作是在保持 GIL的 C 層完成的,因此它以原子方式運行,既返回下一個數字又將計數作為單個原子操作移動。
添加回答
舉報