Pyhthon3之使用__slots__】的更多相关文章

正常情况下,我们定义了一个class,创建了一个class实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): ... pass 尝试给实例绑定一个属性: >>> s=Student() #动态给实例绑定一个属性 >>> s.name='Mike' >>> s.name 'Mike' 还可以尝试给实例绑定一个方法 #定义一个函数作为实例的方法 &g…
1.使用 __slots__    给实例绑定方法, >>> def set_age(self, age): # 定义一个函数作为实例方法 ... self.age = age ... >>>from types import MethodType >>>s.set_age=MethodType(set_age,s) >>>s.set_age(25) >>>s.age 25 为了给所有的实例都绑定方法,可以给类绑定方…
__slots__的作用是防止给class instance分配dict,达到控制instance 成员和节省内存的作用 class Slots(object): __slots__=("name","age") def __init__(self): pass a=Slots() a.name="asdfa" print a.__dict__ a.x=66 #此处异常 不过这个__slots__只对当前类起作用,对于子类就不起重用了,子类如果没…
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性. 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性: class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 然后,我们试试: >>> s = Student() # 创建新的实例 >>> s.name = 'M…
使用__slots__限定实例的成员列表 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应的坏处是,当创建成百上千个这样的实例的时候回很浪费内存.所以引入__slots__,用来指定实例只拥有固定的属性,因此python会给每个实例对象分配固定的内存空间,否则应该就是分配了一块内存了,从而减少内存消耗.而且使用__slots__可以加快属性的访问. 但是,如果我们想要限制实例的属性怎么办…
在伯乐在线上看到了这篇文章,用Python的 __slots__ 节省9G内存,于是想测试下,对单个类,用__slots__节省内存效果会不会明显. 看完这个例子后,我们也会明白__slots__是用来干嘛的. :import sys :class test(object): : def __init__(self,name): : self.name = name : : :class test2(object): : __slots__ = ["name"] : def __ini…
首先需要知道的是,dir() 是 Python 提供的一个 API 函数,dir() 函数会自动寻找一个对象的所有属性,包括搜索 __dict__ 中列出的属性. 不是所有的对象都有 __dict__ 属性.例如,如果你在一个类中添加了 __slots__ 属性,那么这个类的实例将不会拥有 __dict__ 属性,但是 dir() 仍然可以找到并列出它的实例所有有效属性. >>> class Foo(object): ... __slots__ = ('bar', ) ... bar =…
python基础——使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print(s.name) Michael 还可以尝试给…
__slots__ 由于Python是动态语言,任何实例在运行期都可以动态地添加属性. 如果要限制添加的属性,例如,Student类只允许添加 name.gender和score 这3个属性,就可以利用Python的一个特殊的__slots__来实现. 顾名思义,__slots__是指一个类允许的属性列表: class Student(object): __slots__ = ('name', 'gender', 'score') def __init__(self, name, gender,…
__slots__作用:限制类的属性,只给实例绑定任何属性和方法 如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加name和age属性. 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性: >>> class Student(object): ... __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 ... 然后,我们试试: >&…
[使用__slots__] 参考: 1.http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200605560b1bd3c660bf494282ede59fee17e781000 2.http://blog.jobbole.com/52420/…
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'…
__dict__: __slots__:…
动态语言python 可以在程序运行的情况下给class加上功能.具体为 #引入一个 from types import MethodType #方法 #然后 s.set_age = MethodType(set_age, s, Student) #给一个实例绑定方法 #s是一个实例 然后set_age是外面定义的一个方法,student是s实例所属的类. 如果要给整个类绑定set_age方法的话 可以使用 from types import MethodType Student.set_sco…
为什么有"slots"属性? 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应的坏处是,当创建成百上千个这样的实例的时候回很浪费内存.所以引入__slots__,用来指定实例只拥有固定的属性,因此python会给每个实例对象分配固定的内存空间,从而减少内存消耗.而且使用__slots__可以加快属性的访问. 用法 __slots__可以被设置成属性名称的字符串,可遍历的对象或者…
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): ... pass ... 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print s.name Michael 还可以尝试给实例…
一句话说明 __slots__是用来限制实例的属性的,__slots__可以规定实例是否应该有__dict__属性:__slots__不能限制类的属性. 只有__slots__列表内的这些变量名可赋值为实例属性. class A: __slots__=['name'] def __init__(self): self.name='js' self.age=22 a=A() 运行结果: Traceback (most recent call last): File "a.py", lin…
__slots__属性可以设置 允许被设置的属性 class Student: __slots__ = ("name", "age") >>> s = Student() >>> s.age = >>> s.name = "Zoro" >>> s.score = Traceback (most recent call last): File , in <module&g…
Complete output from command python setup.py egg_info: Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-build-qe3ebgj7/progressbar/setup.py", line 5, in <module> import progressba…
当一个类需要创建大量实例时,可以通过__slots__声明实例所需要的属性, 优点: 1)更快的属性访问速度 2)减少内存消耗 3)限定一个类创建的实例只能有固定的实例属性(实例变量),不允许对象添加列表以外的实例属性 4)防止用户因错写属性名称而发生程序错误 缺点: 1)每个继承的子类都要重新定义一遍__slots__ 实例只能包含哪些在__slots__定义的属性,这对写程序的灵活性有影响,比如你由于某个原因新网给instance设置一个新的属性,比如instance.a = 1, 但是由于…
__slots__ 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性. __str__  用这个命令定义方法,可以返回想要的字符串,但是容易看到实例内部重要的数据, 直接显示变量调用的不是__str__(),而是__repr__(),两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的. 解决办法是再定义一个__repr…
使用__slots__但是,如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加name和age属性.为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性: class Student(object):     __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称然后,我们试试:s = Student() # 创建新的实例s.name = 'Michael…
优点: 1. __slots__ 能够减小内存的占用,限制对象只能有这几个属性,再加属性会报错 . 副作用: 1. 设置了__slots__之后,实例对象就没有__dict__了 2. __slots__不能限制子类 详细代码解读: 限制对象只能有这几个属性,再加属性会报错 1. 设置了__slots__之后,实例对象就没有__dict__了 2. __slots__不能限制子类 class BaseResponse(object): __slots__ = ('code', 'data', '…
# 以c语言为主是静态语言,运行之前先编译,在运行的过程中不允许编辑代码# 在运行的过程中,可以改变,可以添加属性,就是属于动态语言(python) # python动态的添加属性以及方法class Test(object): pass # t = Test()# print(dir(t)) # 运行的过程中给对象绑定(添加)属性class Person(object): def __init__(self,newName,newAge): self.name = newName self.ag…
1.运算符重载之反向运算 class A: def __init__(self,x): self.x = x def __add__(self, other): try: x = other.x return self.x + other.x except AttributeError: try: x = int(other) except: x = 0 return A(self.x + x) def __iadd__(self, other): print(self,'iadd') retu…
class Test(object): __slots__ = ("name","age") t = Test() t.name = "老王" t.age = 18 print(t.name) print(t.age) #__slots__用来控制类可以动态添加的属性 t.addr = "山东" 输出 老王 18 Traceback (most recent call last): File "E:/python_c…
Python是一种非常灵活的动态语言,有时感觉太灵活以至于不知道遵循什么样的规则去驾驭.不过Python已经是非常完备的语言,想实现什么样的功能都是有方法的,而且也很容易,比如限制一个类动态添加成员变量. 一般情况下,我们定义完一个类,如果不加任何限制,还可以动态地为该类的对象或该类添加成员变量. class Employee: def __init__(self,name=''): self.name = name if __name__ == "__main__": try: em…
__slots__作用 __slots__有一个作用是:限制类实例绑定的属性,但是它有一个更重要的作用就是节省内存,当然更适用于数据量大的情况(万量级以上). __slots__节省内存的原理 class Measurement: def __init__(self, x, y, value): self.x = x self.y = y self.val = value m1 = Measurement(1, 2, "Happy") m2 = Measurement(7, 10, &…
其实也是无意之中又看到这个东西,这次索性再记一下,免得下次忘记又再看一遍,往复循环浪费了太多时间. __slots__其实我做项目这么久还没有主动使用过.下面reference有提到这么一句话 Warning: Don’t prematurely optimize and use this everywhere! It’s not great for code maintenance, and it really only saves you when you have thousands of…
1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的是独立的) 3.为何使用__slots__:字典会占用大量内存,如果你有一个属性很少的类,但是有很多实例,为了节省内存可以使用__slots__取代实例的__dict__ 当你定义__slots__后,__slots__就会为实例使用一种更加紧凑的内部表…