python中的__slots__使用(转)

如果我们想要限制实例的属性,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性。
使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots

# coding:utf-8
class Player(object):
    def __init__(self, uid, name, stat=0, level=1):
        self.uid = uid
        self.name = name
        self.stat = stat
        self.level = level


class Player2(object):
    __slots__ = ['uid', 'name', 'stat', 'level', 'sex']

    def __init__(self, uid, name, stat=0, level=1):
        self.uid = uid
        self.name = name
        self.stat = stat
        self.level = level


class Player3(Player2):
    def __init__(self, uid, name):
        super(Player3, self).__init__(uid, name)


class Player4(Player2):
    __slots__ = ['age']

    def __init__(self, uid, name):
        super(Player4, self).__init__(uid, name)

 

slots应用实例

如何为创建大量实例节省内存?

问题:某游戏中,定义了玩家类Player(uid, name, status...),每有一个在线玩家,在服务器程序内则有一个Player的实例,当在线人数很多时,将产生大量实例(如百万级)
解决方案:定义类的slots属性,它时用来声明实例属性名字的列表。

交互模式下看到p1和p2的属性,p1比p2使用的内存多,为什么呢,通过对比发现,属性多了__dict____weakref__



作者:udhga
链接:https://www.jianshu.com/p/c4484f424ef7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇:解决spring4连接redis集群报错:CLUSTERDOWN The cluster is down(转载)


下一篇:Python3 __slots__