python魔法方法之 __ slots __的实现,Python中的__slots__魔法方法详解

马肤

温馨提示:这篇文章已超过754天没有更新,请注意相关的内容是否还可用!

摘要:Python中的__slots__是一种用于优化实例属性的机制。它通过限制实例属性的数量和类型,提高性能和内存管理效率。__slots__的实现方式是在类中定义一个特殊的变量,用于声明实例变量名称和类型。使用__slots__可以限制动态属性的添加,提高代码的安全性和性能。过度依赖__slots__可能导致代码灵活性降低,因此在使用时需要权衡利弊。

本文主要介绍了python 魔法方法之 __ slots __的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧!

__ slots __

__slots__是python class的一个特殊attribute,能够节省内存空间。正常情况下,一个类的属性是以字典的形式来管理, 每个类都会有__ dict__ 方法。但是我们可以通过 设置 __ slots__ 来将类的属性构造成一个静态的数据结构来管理,里面存储的是 value references。

class Bar(object):
def __init__(self, a):
self.a = a


class BarSlotted(object):
__slots__ = "a",

def __init__(self, a):
self.a = a


# create class instance
bar = Bar(1)
bar_slotted = BarSlotted(1)

print(set(dir(bar)) - set(dir(bar_slotted)))
# {'__dict__', '__weakref__'}   
'''
使用 __slots__ 后, 类里面会减少 __dict__  __weakref__ 两个方法。
__weakref__  --- 弱引用  详情链接 https://docs.python.org/zh-cn/3/library/weakref.html
'''

优点:

  • 节约内存,不用去定义动态数据接口 __ dict__ 的内存, __ weakref__ 也不用去申请

  • access attributes 更快,静态数据结构,比__ dict__ 更快

缺点:

定义死后,不能去申请新的属性,申请会报属性错误

python魔法方法之 __ slots __的实现,Python中的__slots__魔法方法详解 第1张

可以通过 把 __ dict__ 作为 __ slots__ 的一个属性,实现既能通过定义__ slots__ 节约内存,又实现新属性的定义。

class BarSlotted(object):
__slots__ = "a",'__dict__'

def __init__(self, a):
self.a = a

bar_slotted = BarSlotted(1)
bar_slotted.b = "111"

当你事先知道class的attributes的时候,建议使用slots来节省memory以及获得更快的attribute access。

注意不应当用来限制__slots__之外的新属性作为使用__slots__的原因,可以使用装饰器以及反射的方式来实现属性控制。

注意事项

子类会继承父类的 __ slots__

class Parent(object):
__slots__ = "x", "y"


class Child(Parent):
__slots__ = "z",
# 重复的 x, y 可以不写,
# __slots__ = "x", "y", "z"


child = Child()
print(dir(child)) 
# [..., 'x', 'y', 'z']

不支持多继承, 会直接报错

class ParentA(object):
__slots__ = "x",


class ParentB(object):
__slots__ = "y",


class Child(ParentA, ParentB):
pass

'''
Traceback (most recent call last):
  File "C:/Users/15284/PycharmProjects/pythonProject/test.py", line 69, in <module>
class Child(ParentA, ParentB):
TypeError: multiple bases have instance lay-out conflict
'''

只允许父类中有一方设定了 __ slots__

class AbstractA(object):
  __slots__ = ()

class AbstractB(object):
  __slots__ = "x"

class Child(AbstractA, AbstractB):
  __slots__ = "x", "y"

新版本的 pickle中的 pickle含有slotted class,使用时需要注意



0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 如何购买远程服务器账号(如何购买远程服务器账号密码),如何购买远程服务器账号及密码指南,如何购买远程服务器账号及密码指南,一步步教你选购服务器账号与密码设置,如何购买远程服务器账号及密码设置指南,选购服务器账号与密码设置的步骤教程,如何购买远程服务器账号及密码设置指南,选购与设置教程,如何购买远程服务器账号及密码设置指南——选购与设置教程全解析,如何购买远程服务器账号及密码设置指南,选购与设置教程全面解析,如何购买远程服务器账号及密码设置指南,选购与设置教程全面解析
  • 成都政府购买服务器(成都政府购买服务器有哪些),成都政府服务器采购全解析,购买历程、细节与影响,成都政府服务器采购全解析,购买历程、细节与影响,探究服务器采购之路
  • 购买金蝶服务器分录(企业购买金蝶软件服务费会计分录),企业购买金蝶软件服务费会计分录详解,金蝶服务器分录指南,金蝶服务器与软件服务费会计分录详解,企业购买金蝶软件分录指南
  • 购买服务器需要什么(购买服务器需要什么资质),购买服务器指南,资质与需求全解析,购买服务器资质与需求全解析,资质要求和购买指南,购买服务器资质与需求解析,购买指南与资质要求全攻略,购买服务器资质与需求解析,购买指南与资质要求全攻略,购买服务器资质与需求解析,购买指南与资质要求全攻略,购买服务器资质与需求解析,购买指南与资质要求全攻略,购买服务器资质与需求解析,全方位指南与资质要求攻略,购买服务器资质与需求解析,全方位指南与资质要求攻略
  • 游戏服务器是购买(游戏服务器是购买还是安装),游戏服务器,购买还是安装?选择指南,游戏服务器购买还是安装?选择指南,购买篇还是安装篇?,游戏服务器购买还是安装?选择指南与购买篇解析,游戏服务器购买还是安装?全面解析与选择指南,购买篇 VS 安装篇的考量与决策建议。,游戏服务器购买还是安装?全面解析与选择指南,购买篇与安装篇的考量与决策建议。,游戏服务器购买还是安装?全面解析与选择指南,购买篇与安装篇的考量与决策建议。,游戏服务器购买还是安装?全面解析与选择指南,购买篇与安装篇的考量与决策建议。
  • 政府可以购买哪些项目的服务器(政府可以购买哪些项目的服务器设备),政府服务器采购项目概览,哪些项目设备在采购之列?,政府服务器采购项目概览,哪些项目设备在采购之列?政府可购买服务器设备项目解析,政府服务器采购项目概览,哪些项目设备在采购之列?解析政府可购买的服务器设备项目,政府服务器采购项目概览,解析可购买服务器设备项目及其采购之列,政府服务器采购项目概览,解析可购买服务器设备及其采购之列的项目分析,政府服务器采购项目概览,解析可购买服务器设备及其采购之列的项目分析
  • 关于购买微软服务器操作系统(关于购买微软服务器操作系统的通知),微软服务器操作系统购买指南,最新通知与指南,微软服务器操作系统购买指南,最新通知与购买指南概览,微软服务器操作系统购买指南,最新通知与购买指南概览,微软服务器操作系统购买指南,最新通知与购买指南概览,微软服务器操作系统购买指南,最新通知与购买指南概览
  • 购买域名服务器怎么做账(购买域名服务器怎么做账务),购买域名服务器的账务处理方式与操作指南,购买域名服务器的账务处理方式与操作指南,如何做账与账务处理?,购买域名服务器的账务处理方式与操作指南,从购买到做账全流程解析,购买域名服务器全流程解析,账务处理方式与操作指南,从选购到做账的详细指南,购买域名服务器全流程详解,账务处理与操作指南,购买域名服务器全流程详解,账务处理方式与操作指南,从选购到做账的指南大全,购买域名服务器全流程详解,账务处理方式与操作指南——从选购到做账的指南大全
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,280人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码