python中的__slots__使用示例

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:

代码如下:

>>> class Staff(object):
...     pass
...

然后,尝试给实例绑定一个属性:

代码如下:

>>> s = Staff()
>>> s.name = 'jack'
>>> print s.name
jack
>>>

还可以尝试给实例绑定一个方法:

代码如下:

>>> def set_age(self,age):
...     self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s, Staff)
>>> s.set_age(34)
>>> s.age
34

但是,给一个实例绑定的方法,对另一个实例是不起作用的:

代码如下:

>>> s2 = Staff()
>>> s2.set_age(35)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Staff' object has no attribute 'set_age'

为了给所有实例都绑定方法,可以给class绑定方法:

代码如下:

>>> def set_score(self, score):
...     self.score = score
...
>>> Staff.set_score = MethodType(set_score, None, Staff)

给class绑定方法后,所有实例均可调用:

代码如下:

>>> s.set_score(100)
>>> s.score
100
>>> s2.set_score(99)
>>> s2.score
99

通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。

使用__slots__

但是,如果我们想要限制class的属性怎么办?比如,只允许对Staff实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

代码如下:

>>> class Staff(object):
...     __slots__ = ('name', 'age')
...

然后,我们试试:

代码如下:

>>> s = Staff()
>>> s.name = 'jack'
>>> s.age = 34
>>> s.score = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Staff' object has no attribute 'score'

由于‘sorce'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:

代码如下:

>>> class GraduateStaff(Staff):
...     pass
...
>>> g = GraduateStaff()
>>> g.score = 9999
>>> g.score
9999

除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__。

(0)

相关推荐

  • 在Python中使用__slots__方法的详细教程

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): ... pass ... 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print s.name Michael 还可以尝试给实例

  • Python中的__slots__示例详解

    前言 相信Python老鸟都应该看过那篇非常有吸引力的Saving 9 GB of RAM with Python's slots文章,作者使用了__slots__让内存占用从25.5GB降到了16.2GB.在当时来说,这相当于用一个非常简单的方式就降低了30%的内存使用,着实惊人.作者并没有提到他的业务特点和代码,那我们就基于<fluent python>中的例子来验证下是不是有这么厉害: from __future__ import print_function import resour

  • 用Python中的__slots__缓存资源以节省内存开销的方法

    我们曾经提到,Oyster.com的Python web服务器怎样利用一个巨大的Python dicts(hash table),缓存大量的静态资源.我们最近在Image类中,用仅仅一行__slots__代码,让每个6G内存占用的服务进程(共4个),省出超过2G来. 这是其中一个服务器在部署代码前后的截图: 我们alloc了大约一百万个类似如下class的实例:   class Image(object):     def __init__(self, id, caption, url):   

  • python中__slots__用法实例

    本文实例讲述了python中__slots__的用法.分享给大家供大家参考.具体分析如下: 定义__slots__ 后,可以再实例上分配的属性名称将被限制为指定的名称.否则将引发AttributeError,这种限制可以阻止其他人向现有的实例添加新的属性.   使用__slots__的类的实例不在使用字典来存储数据.相反,会使用基于数组的更加紧凑的数据结构. 在会创建大量对象的程序中,使用__slots__可以显著减少内存占用和使用时间 class Account(object): __slot

  • Python中的__SLOTS__属性使用示例

    看python社区大妈组织的内容里边有一篇讲python内存优化的,用到了__slots__.然后查了一下,总结一下.感觉非常有用 python类在进行实例化的时候,会有一个__dict__属性,里边有可用的实例属性名和值.声明__slots__后,实例就只会含有__slots__里有的属性名. # coding: utf-8 class A(object): x = 1 def __init__(self): self.y = 2 a = A() print a.__dict__ print(

  • python中的__slots__使用示例

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: 复制代码 代码如下: >>> class Staff(object): ...     pass ... 然后,尝试给实例绑定一个属性: 复制代码 代码如下: >>> s = Staff() >>> s.name = 'jack' >>> print s.name jack >&g

  • python中hashlib模块用法示例

    我们以前介绍过一篇Python加密的文章:Python 加密的实例详解.今天我们看看python中hashlib模块用法示例,具体如下. hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 具体应用 #!/usr/bin/env python # -*- coding: UTF-8 -*- #pyversion:python3.5 #owner:fuzj import h

  • Python中字符串与编码示例代码

    在最新的Python 3版本中,字符串是以Unicode编码的,即Python的字符串支持多语言 编码和解码 字符串在内存中以Unicode表示,在操作字符串时,经常需要str和bytes互相转换   如果在网络上传输或保存到磁盘上,则从内存读到的数据就是str,要把str变为以字节为单位的bytes,称为编码   如果从网络或磁盘上读取字节流,则从网络或磁盘上读到的数据就是bytes,要把bytes变为str,称为解码   为避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行

  • Python中图像算术运算的示例详解

    目录 介绍 算术运算:图像相加 算术运算:图像减法 位运算 介绍 还记得你在小学时学习如何加减数字吗?现在,你也可以对图像做同样的事情! 输入图像可以进行算术运算,例如加法.减法和按位运算(AND.OR.NOT.XOR).这些操作可以帮助提高输入照片的质量. 在本文中,你将了解使用 OpenCV Python 包对图像执行算术和按位运算的步骤.让我们开始吧! 对图像进行算术运算是什么意思? 因此,假设我们希望合并两张单独的照片中的两个像素.我们怎样才能将它们合并? 让我们想象以下场景.第一个像素

  • python中文件变化监控示例(watchdog)

    在python中文件监控主要有两个库,一个是pyinotify ( https://github.com/seb-m/pyinotify/wiki),一个是watchdog(http://pythonhosted.org/watchdog/).pyinotify依赖于Linux平台的inotify,后者则对不同平台的的事件都进行了封装.因为我主要用于Windows平台,所以下面着重介绍watchdog(推荐大家阅读一下watchdog实现源码,有利于深刻的理解其中的原理). watchdog在不

  • Python中的Super用法示例详解

    目录 Python Super用法 附:super的典型用法 总结 Python Super用法 这篇文章我们来介绍一下 super,我相信大部分的人使用 super 都是使用这种方式: # 就是我有一个 class 比如说是 Male,然后继承另外一个 class 比如是 Person,然后我在这个 Male 也就是它的子类的 init 函数里面用 super().__init__() 来调用它父类的初识化函数 from objprint import op class Person: def

  • python中的对象拷贝示例 python引用传递

    何谓引用传递,我们来看一个C++交换两个数的函数: 复制代码 代码如下: void swap(int &a, int &b){    int temp;    temp = a;    a = b;    b = temp;} 这个例子就是一个引用传递的例子!目的是说明一下概念:引用传递的意思就是说你传递的是对象的引用,对这个引用的修改也会导致原有对象的改变.学过C/C++的朋友们都知道,在交换2个数的时候,如果自己实现一个swap函数,需要传递其引用或者指针. Python直接使用引用传

  • Python中list初始化方法示例

    本文实例讲述了Python中list初始化方法.分享给大家供大家参考,具体如下: 1.基本方法. lst = [1, 2, 3, 4, 5] 2.初始化连续数字. >>> lst = [n for n in range(5, 10)] >>> print(lst) [5, 6, 7, 8, 9] 3.初始化n个相同值.(两种方式) >>> lst = ['x' for n in range(5)] >>> print(lst) ['x

  • Python中的面向接口编程示例详解

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝. 最近无意间看到了我刚开始写 Python 时的部分代码,当时实现的需求有个很明显的特点: 不同对象具有公共的行为能力,但具体每个对象的实现方式又各不相同. 说人话就是商户需要接入平台,接入的步骤相同,但具体实现不同. 作为一个"资深" Javaer,需求还没看完我就洋洋洒洒的把各个实现

随机推荐