为了账号安全,请及时绑定邮箱和手机立即绑定

python:为每个新对象添加编号

python:为每个新对象添加编号

喵喔喔 2021-11-02 15:42:53
我想在每次创建对象时更改对象的名称,以便每次创建对象时都会添加一个累加器。在这个例子中,我希望第一个 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我想不出一种方法来避免尝试将变量设置为等于加一个本身的问题,因为它本身尚未定义。
查看完整描述

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 层完成的,因此它以原子方式运行,既返回下一个数字又将计数作为单个原子操作移动。


查看完整回答
反对 回复 2021-11-02
  • 2 回答
  • 0 关注
  • 296 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号