我想在每次创建对象时更改对象的名称,以便每次创建对象时都添加一个累加器。在此示例中,我希望第一个object.name为B1,然后第二个object.name为B2,然后为B3,依此类推。这就是我想要得到的
class Object:
def __init__(self):
self.name = "B" + (accumulator)
这是我尝试过的方法,但我真的没有得到任何帮助
class BankAccount:
def __init__(self, balance):
self.account_number = "B" + str(number = number + 1)
self.balance = balance
我想不出一种方法来避免尝试将变量设置为等于自身加上一个变量的问题,因为尚未定义自身。
答案 0 :(得分:5)
这里最简单的方法是一个类变量,该变量存储要使用的下一个值,使用后可将其递增:
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
这虽然没有锁定也不是线程安全的,所以如果您想要线程安全,请以线程安全(至少在CPython上)的方式itertools.count
can do the same job:
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
的工作是在the GIL held的C层完成的,因此它是原子操作的,既返回下一个数字,又将计数作为单个原子操作移动。
答案 1 :(得分:3)
您可以让一个类级别的变量维护创建了多少个对象,然后使用该变量来确定名称
class BankAccount:
count = 0
def __init__(self):
self.name = "B" + str(BankAccount.count)
BankAccount.count += 1
但是,这不是线程安全的,如@ShadowRanger所述。按照他们的建议使用itertools.count
是个更好的主意。