通过实例了解python__slots__使用方法

一、背景

python是一个动态语言,可以支持我们在运行时动态的给类、对象添加属性或者方法;但是如果我们想要限制可以添加的属性或方法该怎么办呢?

二、__slots__

python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

>>> class Student(object):
... __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
...

然后尝试添加属性:

>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

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

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

>>> class GraduateStudent(Student):
... pass
...
>>> g = GraduateStudent()
>>> g.score = 9999

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 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__用法实例

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

  • python使用__slots__让你的代码更加节省内存

    前言 在默认情况下,Python的新类和旧类的实例都有一个字典来存储属性值.这对于那些没有实例属性的对象来说太浪费空间了,当需要创建大量实例的时候,这个问题变得尤为突出. 因此这种默认的做法可以通过在新式类中定义了一个__slots__属性从而得到了解决.__slots__声明中包含若干实例变量,并为每个实例预留恰好足够的空间来保存每个变量,因此没有为每个实例都创建一个字典,从而节省空间. 本文主要介绍了关于python使用__slots__让你的代码更加节省内存的相关内容,分享出来供大家参考学

  • Python类中的魔法方法之 __slots__原理解析

    在类中每次实例化一个对象都会生产一个字典来保存一个对象的所有的实例属性,这样非常的有用处,可以使我们任意的去设置新的属性. 每次实例化一个对象python都会分配一个固定大小内存的字典来保存属性,如果对象很多的情况下会浪费内存空间. 可通过__slots__方法告诉python不要使用字典,而且只给一个固定集合的属性分配空间 class Foo(object): __slots__ = ("x","y","z") def __init__(sel

  • Python中__slots__属性介绍与基本使用方法

    简介 在廖雪峰的python网站上,他是这么说的 python是动态语言,它允许程序在执行过程中动态绑定属性或者方法(使用MethodTpye). 某个实例在执行过程中绑定的属性跟方法,仅在该实例中有效,其他同类实例是没有的. 可以通过给class绑定属性/方法,来给所有实例绑定属性/方法: Student.name = '' Student.set_score = set_score 而如果使用__slots__,它仅允许动态绑定()里面有的属性 例如,下面这样会报错 class Studen

  • 用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社区大妈组织的内容里边有一篇讲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 Student(object): ... pass ... 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print s.name Michael 还可以尝试给实例

  • 通过实例了解python__slots__使用方法

    一.背景 python是一个动态语言,可以支持我们在运行时动态的给类.对象添加属性或者方法:但是如果我们想要限制可以添加的属性或方法该怎么办呢? 二.__slots__ python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性: >>> class Student(object): ... __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 ... 然后尝试添加属性: >>>

  • Python3编程实现获取阿里云ECS实例及监控的方法

    本文实例讲述了Python3编程实现获取阿里云ECS实例及监控的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python3.5 # -*- coding:utf8 -*- try: import httplib except ImportError: import http.client as httplib import sys,datetime import urllib import urllib.request import urllib.error impor

  • python通过定义一个类实例作为ftp回调方法

    本文实例讲述了python通过定义一个类实例作为ftp回调方法.分享给大家供大家参考.具体实现方法如下: class Writer: def __init__(self, file): self.f = open(file, "w") def __call__(self, data): self.f.write(data) self.f.write('\n') print data FILENAME = "AutoIndent.py" writer = Writer

  • JS实现星星评分功能实例代码(两种方法)

    一.方法1 1.用到图片 2.结构和样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> ul { padding-left: 0; overflow: hidden; } ul li { float: left; list-style: no

  • C#确保只有一个实例在运行的方法

    本文实例讲述了C#确保只有一个实例在运行的方法.分享给大家供大家参考.具体实现方法如下: public static Process RunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName (current.ProcessName); //查找相同名称的进程 foreach (Process process in proc

  • python 类对象和实例对象动态添加方法(分享)

    实例如下所示: class Person(): def __init__(self, name): self.name = name def print_name(self): print(self.name) p = Person('Li') import types p.print_name = types.MethodType(print_name, p) # 绑定函数到对象 p.print_name() @staticmethod def print_abc(): print('abc'

  • JavaScript数组实例的9个方法

    目录 前言 map filter some every reduce forEach find和findIndex join 总结 前言 手写JS原生API在面试中很常见,今天努力工作之余(摸鱼的时候)翻到了MDN文章中关于数组实例方法这部分,正好无聊就手写几个实例方法玩玩,复习一下基础内容,并记录一下. 如果你还不知道数组实例中迭代方法有什么区别,可以看下面这张图: map 这个方法会返回一个新的数组,数组中的每一项都是执行过map提供的回调函数结果. 实现代码如下: const map =

  • vue2中组件互相调用实例methods中的方法实现详解

    目录 前言: 开始前: 使用 第一步.定义全局mixin 第二步添加代码提示d.ts声明文件 在项目下新建jsconfig.json 添加shims-vue.d.ts声明文件 添加event-keys.d.ts声明文件 第三步编写webpack插件 新建global-dispatch.js 自动生成event-keys.d.ts 添加vue-path-loader.js webpack loader文件 配置vue.config.js 后记 仓库地址 总结 前言: 大家都知道在vue2中相互调用

  • win2003 服务器 安全设置 技术实例(比较安全的方法)

    1.服务器安全设置之--硬盘权限篇 这里着重谈需要的权限,也就是最终文件夹或硬盘需要的权限,可以防御各种木马入侵,提权攻击,跨站攻击等.本实例经过多次试验,安全性能很好,服务器基本没有被木马威胁的担忧了. 硬盘或文件夹: C:\ D:\ E:\ F:\ 类推 主要权限部分: 其他权限部分: Administrators 完全控制 无如果安装了其他运行环境,比如PHP等,则根据PHP的环境功能要求来设置硬盘权限,一般是安装目录加上users读取运行权限就足够了,比如c:\php的话,就在根目录权限

  • 解决C#程序只允许运行一个实例的几种方法详解

    本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运行.要实现程序的互斥,通常有下面几种方式,下面用 C# 语言来实现:方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: 复制代码 代码如下: using System;using System.Windows.Forms;using System.Runtime.InteropServices;namespace NetTools{    static cl

随机推荐