首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

命名元组的子类化vs实现__slots__?

命名元组的子类化和实现slots是两种不同的方式来自定义元组的行为和属性。

  1. 命名元组的子类化:
    • 概念:命名元组是一个具有字段名和对应值的不可变的数据结构。子类化命名元组可以通过继承命名元组类并添加额外的方法或属性来扩展其功能。
    • 分类:命名元组的子类化是一种面向对象的方式来扩展命名元组的功能。
    • 优势:通过子类化命名元组,可以在不改变原始命名元组的情况下,添加自定义的方法和属性,以满足特定的需求。
    • 应用场景:命名元组的子类化适用于需要在命名元组基础上进行功能扩展的情况,例如添加计算属性、自定义方法等。
    • 腾讯云相关产品和产品介绍链接地址:暂无推荐的腾讯云相关产品和产品介绍链接地址。
  • 实现slots
    • 概念:slots是一个类级别的属性,用于限制实例可以动态添加的属性。通过在类中定义slots属性,可以限制实例的属性只能是预先定义好的属性。
    • 分类:实现slots是一种通过限制属性来控制类的行为和内存占用的方式。
    • 优势:通过实现slots,可以减少实例的内存占用,并且限制属性的添加,提高属性访问的速度。
    • 应用场景:实现slots适用于需要限制实例属性的情况,特别是在需要创建大量实例对象时,可以减少内存占用和提高性能。
    • 腾讯云相关产品和产品介绍链接地址:暂无推荐的腾讯云相关产品和产品介绍链接地址。

总结:命名元组的子类化和实现slots是两种不同的方式来自定义元组的行为和属性。命名元组的子类化适用于需要在命名元组基础上进行功能扩展的情况,而实现slots适用于需要限制实例属性和减少内存占用的情况。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

2 . python Collectio

nametuple() 是具有命名字段元组工厂函数 命名元组元组中每个位置赋予含义,并允许更具可读性自编写代码  它们可以在任何使用常规元组地方使用,并且他们添加了按名称而不是位置索引访问字段功能...如果定义了module,则将命名元组__module__属性将设置为该值。 命名元组实例没有每个实例字典,因此它们是轻量级,并且不需要比常规元组占用更多内存。...上面显示子类将__slots__设置为一个空元组。 这有助于防止创建实例字典,从而降低内存需求。                 ...子类化对于添加新存储字段没有用处。                  相反,只需从_fields属性创建一个新命名元组类型: ?                 ...可以使用_replace()来自定义原型实例来实现默认值: ?

1.1K10

你写 Python 代码可以更“瘦”

>>> ob['y'] = y 由于在 Python 3.6 中 dict 实现采用了一组有序键,因此其结构更为紧凑,更深得人心。...(ob)) 72 由于内存中元组还包含字段数,因此需要占据内存 8 个字节,多于带有 __slots__ 类: 字段 大小(字节) PyGC_Head 24 PyObject_HEAD 16 ob_size...8 [0] 8 [1] 8 [2] 8 总计: 72 命名元组 由于元组使用非常广泛,所以终有一天你需要通过名称访问元组。...但大量实例占用内存也会稍稍多一些: 实例数 大小 1 000 000 72 Mb 10 000 000 720 Mb 100 000 000 7.2 Gb 记录类:不带循环 GC 可变更命名元组...由于元组及其相应命名元组类能够生成不可修改对象,因此类似于 ob.x 对象值不能再被赋予其他值,所以有时还需要可修改命名元组

63430

你写 Python 代码也需要减肥!

'] >>> ob['y'] = y 由于在 Python 3.6 中 dict 实现采用了一组有序键,因此其结构更为紧凑,更深得人心。...(ob)) 72 由于内存中元组还包含字段数,因此需要占据内存 8 个字节,多于带有 __slots__ 类: 字段 大小(字节) PyGC_Head 24 PyObject_HEAD 16 ob_size...8 [0] 8 [1] 8 [2] 8 总计: 72 04.命名元组 由于元组使用非常广泛,所以终有一天你需要通过名称访问元组。...但大量实例占用内存也会稍稍多一些: 实例数 大小 1 000 000 72 Mb 10 000 000 720 Mb 100 000 000 7.2 Gb 05.记录类:不带循环 GC 可变更命名元组...由于元组及其相应命名元组类能够生成不可修改对象,因此类似于 ob.x 对象值不能再被赋予其他值,所以有时还需要可修改命名元组

77430

Python 面向对象进阶

但是有很多实例,为了节省内存可以使用__slots__取代实例__dict__ 7 当你定义__slots__后,__slots__就会为实例使用一种更加紧凑内部表示,实例通过一个很小固定大小数组来构建...,而不是为每个势力定义一个 8 字典,这跟元组或列表很类似。...在__slots__中列出属性名在内部被映射到这个数组指定小标上,使用__slots__一个不好地方就是我们不能再给实例添加新属性了, 9 只能使用__slots__中定义那些属性名。...10 4.注意事项:__slots__很多特性都依赖于普通基于字典实现。另外,定义了__slots__类不在支持一些普通类特性了。比如继承。...12 关于__slots__一个常见误区是:它可以作为一个封装工具来防止用户给实例添加新属性。尽管使用__slots__可以达到这样目的,但是这个并不是初衷。

32110

如何降低 Python 内存消耗量?

ob['y'] = y 由于在Python 3.6中dict实现采用了一组有序键,因此其结构更为紧凑,更深得人心。...(ob)) 72 由于内存中元组还包含字段数,因此需要占据内存8个字节,多于带有__slots__类: 字段 大小(字节) PyGC_Head 24 PyObject_HEAD 16 ob_size...命名元组 由于元组使用非常广泛,所以终有一天你需要通过名称访问元组。为了满足这种需求,你可以使用模块collections.namedtuple。...记录类:不带循环GC可变更命名元组 由于元组及其相应命名元组类能够生成不可修改对象,因此类似于ob.x对象值不能再被赋予其他值,所以有时还需要可修改命名元组。...CPython实现中是最小: 实例数 大小 1 000 000 40 Mb 10 000 000 400 Mb 100 000 000 4.0 Gb ?

1.5K20

如何将Python内存占用缩小20倍?

Dict 在小程序中,特别是在脚本中,使用内置dict来表示结构信息是非常简单方便: ? 随着Python 3.6中使用一组有序键更紧凑实现方式出现,dict变得更有吸引力。...这通过一个带有__slots__小“技巧”是可能实现: ? RAM中对象大小明显变小了: ? 在类定义中使用__slots__可以显著减少大量实例对内存空间占用: ?...元组 Python还有一个内置类型tuple(元组),用于表示不可变数据结构。一个元组是一个固定结构或记录,但没有字段名。对于字段访问,使用是字段索引。...元组字段在元组实例创建时就一次性与值对象相关联: ? 元组实例是相当简洁: ? 它们在内存中占用字节比使用__slots__类实例要多8个字节,因为内存中元组跟踪也包含许多字段: ?...Namedtuple(命名元组) 由于元组使用非常广泛,某天有人可能会提交一个通过名称访问字段请求。这个请求答案是collections.namedtuple模块。

3.6K20

工具 | 学习总结:当我学完Python我学了些什么

1 >>>mmm=max2 >>>mmm(1,2,3)3 3 2.Python函数可以返回“多个值”,之所以打引号,是因为实际上返回多个值拼成了一个元组,返回这个元组。...7.参数定义顺序:必选参数,默认参数,可变参数/命名关键字参数,关键字参数。...注意,__slots__限制属性对当前类实例起完全限制作用,且与子类共同定义其__slots__,也就是说子类可以定义自己__slots__,子类实例允许定义属性就是自身__slots__加上父类...七、进程与线程 1.Python用mutiprocessing模块来实现多进程。 2.如果要大量创建进程,可以使用进程池,示例如下: ?...3.使用subprocess模块可以方便启动并管理一个进程,控制其输入输出。 4.进程间通信使用Queue,Pipes实现。 5.threading模块管理线程。

983100

流畅 Python 第二版(GPT 重译)(六)

⑥ 如果你设置一个未在__slots__命名属性… ⑦ …它存储在实例__dict__中。 示例 11-14 显示了__slots__效果只被子类部分继承。...如果你声明__slots__ = ()(一个空元组),那么子类实例将没有__dict__,并且只接受基类__slots__命名属性。...如果你希望子类具有额外属性,请在__slots__命名它们,就像示例 11-15 中所示那样。 示例 11-15。...使用__slots__类不能使用@cached_property装饰器,除非在__slots__中明确命名'__dict__'。...我们讨论最后一个主题是覆盖通过实例访问类属性(例如,self.typecode)。我们首先通过创建实例属性,然后通过子类化和在类级别上重写来实现

10210

如何优化Python占用内存

Dict 使用Python内置数据结构Dict来实现上述例子需求很简单。...使用__slots__也是有副作用: 每个继承子类都要重新定义一遍__slots__ 实例只能包含哪些在__slots__定义属性,这对写程序灵活性有影响,比如你由于某个原因新网给instance...Tuple Python还有一个内置类型元组,用于表示不可变数据结构。 元组是固定结构或记录,但没有字段名称。 对于字段访问,使用字段索引。...在创建元组实例时,元组字段一次性与值对象关联: >>> ob = (1,2,3) >>> x = ob[0] >>> ob[1] = y # ERROR 元组示例很简洁: >>> print(sys.getsizeof...__new__(cls, (x, y, z)) 此类所有实例都具有与元组相同内存占用。

1.8K20

Python编程思想(28):限制类动态特性(__slots__属性)

前面介绍了如何为对象动态添加方法,但是所添加方法只是对当前对象有效,如果希望为所有实例都添加方法,则可通过为类添加方法来实现,代码如下: 示例代码:dynamic_class_method. py class...__slots__属性值是一个元组,该元组所有元素列出了该类实例允许动态添加所有属性名和方法名(对于 Python而言,方法与属性相同,只是这类属性值为函数本身),代码如下: 示例代码:slots_demo...'sleep' 需要说明是, __slots__属性并不限制通过类来动态添加属性或方法,因此下面代码是合法。...MyDog实例完全可以动态添加 sleep属性,这说明__slots__属性指定限制只对当前类起作用。...如果要限制子类实例动态添加属性和方法,则需要在子类中也定义__ slots__属性,这样,子类实例允许动态添加属性和方法就是子类__ slots__元组加上父类__slots__元组和,代码如下

66330

__slots__(面向对象进阶)

属性字典(类字典是共享,而每个实例是独立) 3.为何使用__slots__:字典会占用大量内存,如果你有一个属性很少类,但是有很多实例,为了节省内存可以使用__slots__取代实例__dict...__ 当你定义__slots__后,__slots__就会为实例使用一种更加紧凑内部表示。...实例通过一个很小固定大小数组来构建,而不是为每个实例定义一个 字典,这跟元组或列表很类似。在__slots__中列出属性名在内部被映射到这个数组指定小标上。...使用__slots__一个不好地方就是我们不能再给 实例添加新属性了,只能使用在__slots__中定义那些属性名。 4.注意事项:__slots__很多特性都依赖于普通基于字典实现。...关于__slots__一个常见误区是它可以作为一个封装工具来防止用户给实例增加新属性。尽管使用__slots__可以达到这样目的,但是这个并不是它初衷。

38040

流畅 Python 第二版(GPT 重译)(十三)

② 接受类似于collections.namedtuple前两个参数;返回一个type,即一个类,其行为类似于tuple。 ③ 构建属性名称元组;这将是新类__slots__属性。...我们可以将__slots__类属性命名为其他任何名称,但然后我们必须实现__setattr__来验证被分配属性名称,因为对于类似记录类,我们希望属性集始终相同且顺序相同。...为什么__init_subclass__无法配置__slots__ __slots__属性仅在它是传递给type.__new__命名空间中条目之一时才有效。...要在运行时配置 __slots__,您自己代码必须构建作为 type.__new__ 最后一个参数传递命名空间。...⑧ …填充cls_dict中__slots__条目——正在构建命名空间。

12510

符合 Python 风格对象

在前面的博客中,我们讲到了 Python 中字典底层实现,字典运算速度很快,但相当吃内存。而当类属性多到一定数量时,我们需要用到 __slots__ 属性,来节省内存。...使用 __slots__ 类属性节省空间 在 Python 中,唯一节省内存数据结构是元组,所以 __slots__ 属性实现方法是让解释器在元组中存储实例属性,而不是字典。...其定义十分简单: class Test: __slots__ = ("__integer", "__decimals") 使用元组形式也就意味着这些属性不可变。...有几点需要注意是: 每个子类都要定义 __slots__ 属性,因为解释器会忽略继承该属性; 对象只能拥有 __slots__ 中列出属性,除非将 __dict__ 加入其中; 用户自定义类中默认有...如果使用得当, __slots__ 属性能显著节省内存,而该属性存在是为了优化,不能用此作为限制用户赋值属性。

54130

让你比95%的人更懂Pythonic内置模块:collections

扩展内置类型 有时,我们需要使一个对象具备Python内置类型功能,在此基础上还需要增加一些功能。为了达到这个目的,最通用方法是直接子类化该类。...按照经验来说,当返回值超过3个时,最好使用命名元组(namedtuples)来取代普通写法。...使用命名元组例子中,首先很明显就能知道返回值是一个特殊类型对象,通过查看对象定义就可以了解其包含数据及数据访问方法。...结论 文本总共探讨了集合以下几点: 1、不要直接子类化内置类型:需要时候优先使用UserDict 、UserList或者UserString。...直接对内置类型进行子类化将会产生一些很难第一眼定位、调试未知错误。 2、当需要给多个值进行分类,或者函数需要返回多个参数时,使用 命名元组(namedtuple)。

76450

Python如何设计面向对象类(上)

目标 期望实现类具有以下基本行为: __repr__ 为repr()提供支持,返回便于开发者理解对象字符串表示形式。 __str__ 为str()提供支持,返回便于用户理解对象字符串表示形式。...通过__slots__类属性,能把实例属性存储到元组里,大大节省内存空间。...示例: class Vector2d: __slots__ = ('__x', '__y') typecode = 'd' 有几点需要注意: 必须把所有属性都定义到__slots__元组中...子类也必须定义__slots__。 实例如果要支持弱引用,需要把__weakref也加入__slots__。 覆盖类属性 实例覆盖 Python有个很独特特性:类属性可用于为实例属性提供默认值。...小结 本文先介绍了如何实现特殊方法来设计一个Python风格类,然后分别实现了格式化显示与可散列对象,使用__slots__能为类节省内存,最后讨论了类属性覆盖技术,子类覆盖是Django基于类视图大量用到技术

91530

定制类和黑魔法

我们在代码中增加了特殊方法__add__(),它就是实现加法运算符魔术方法。在python中,运算符作用是简化书写,实现运算运算符都有其对应特殊方法支撑才得以实现。...__slots__属性是类和对象共用,它把实例属性牢牢地管控起来,只能是定义类时指定属性。如果要增加、修改属性,只能通过类来实现。...4.注意事项:__slots__很多特性都依赖于普通基于字典实现。另外,定义了__slots__类不再支持一些普通类特性了,比如多继承。     ...同样,对象通过键方式操作属性时,也会触发上面的三种方法。需要注意是,字符串和元组只能取出其元素,不等删除和修改元素,所以字符串和元组中只有__getitem__方法。   ...当然子类依然可以使用父类中内容。 反射和黑魔法应用   要在一个类中使用另一个类中方法,可以利用继承方式去实现,继承也可以实现覆写,即定义自己同名方法。

45310

Python 基础:类与函数

MRO __slots__ 子类没有__slots__属性 子类拥有__slots__属性 2.2 总结: 本文介绍了Python中继承,当使用多继承时候,可以使用super...另外介绍了Python类__slots__属性,通过这个属性可以限制类实例可用属性。...作为自己第一个参数,然后依次传入”__new__”方法中接收位置参数和命名参数;但是,如果”__new__”没有返回cls(即当前类)实例,那么当前类”__init__”方法是不会被调用。...type实际上是它自己元类,在纯Python环境中这可不是你能够做到,这是通过在实现层面耍一些小手段做到。其次,元类是很复杂。对于非常简单类,你可能不希望通过使用元类来对类做修改。...通过实现迭代器协议对应__iter__()和next()方法,可以自定义迭代器类型。

90890

爆肝 50 道 Python 面试题 (下)

通常一个文件夹下还可以有文件夹,这也就意味着一个包下还可以有包,包中__init__.py并不是必须。...我们并不建议使用这种退化类,在Python中可以用namedtuple(命名元组)来替代这种类。...和普通元组不同是,命名元组数据有访问名称,可以通过名称而不是索引来获取保存数据,不仅在操作上更加简单,代码可读性也会更好。 命名元组本质就是一个类,所以它还可以作为父类创建子类。...除此之外,命名元组内置了一系列方法,例如,可以通过_asdict方法将命名元组处理成字典,也可以通过_replace方法创建命名元组对象浅拷贝。...在需要创建占用空间更少不可变类时,命名元组就是很好选择。 题目46 按照题目要求写出对应函数。

60020
领券