首页
学习
活动
专区
工具
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 的对象值不能再被赋予其他值,所以有时还需要可修改的命名元组。

64830
  • 你写的 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 的对象值不能再被赋予其他值,所以有时还需要可修改的命名元组。

    81330

    Python 面向对象进阶

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

    34710

    如何降低 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.6K20

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

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

    3.8K20

    工具 | 学习总结:当我学完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模块管理线程。

    1K100

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

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

    14910

    如何优化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.9K20

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

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

    69830

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

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

    17010

    __slots__(面向对象进阶)

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

    40140

    符合 Python 风格的对象

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

    55630

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

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

    78650

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

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

    94230

    定制类和黑魔法

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

    47310

    Python 基础:类与函数

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

    94590

    爆肝 50 道 Python 面试题 (下)

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

    64620

    提高代码效率的6个Python内存优化技巧

    因为Python中每个类的实例都维护一个特殊的字典(__dict__)来存储实例变量。因为字典的底层基于哈希表的实现所以消耗了大量的内存。...由于属性是固定的,Python不需要为它维护字典,只为__slots__中定义的属性分配必要的内存空间。...Python已经提供了用于使用此技术的内置模块,因此我们可以轻松地利用它,而无需考虑操作系统级别的实现。...1、元组比列表更节省内存 元组是不可变的(在创建后不能更改),它允许Python在内存分配方面进行优化。列表是可变的,因此需要额外的空间来容纳潜在的修改。...my_tuple比列表使用更少的内存,如果创建后不需要更改数据,我们应该选择元组而不是列表。

    29810
    领券