博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python面向对象-类、实例的绑定属性、绑定方法和__slots__
阅读量:6498 次
发布时间:2019-06-24

本文共 1935 字,大约阅读时间需要 6 分钟。

绑定属性

从之前的文章中,我们知道python是动态语言——实例可以绑定任意属性。

那如果实例绑定的属性和类的属性名一样的话,会是什么情况呢?

>>> class Student(object):...     name = 'wc'...>>> s = Student()>>> s.name'wc'>>> Student.name'wc'>>> s.name = 'ly' #给实例绑定name属性>>> s.name'ly'>>> Student.name'wc'>>> del s.name #删除实例的name属性>>> s.name'wc'

可知,我们可以给实例变量绑定和类属性同样名字的变量;同时如果实例变量和类属性使用相同的名字时,实例属性将屏蔽掉类属性;最后,如果删除实例属性后,同样的名称,访问的是类的属性。

绑定方法

>>> def setAge(self,age):...     self.age = age...>>> from types import MethodType>>> s.setAge = MethodType(setAge,s)#给实例绑定一个方法>>> s.setAge(66)>>> s.age66

我们来验证一下,给一个实例绑定的方法,对另外一个实例有作用吗:

>>> s2 = Student()>>> s2.setAgeTraceback (most recent call last):  File "
", line 1, in
AttributeError: 'Student' object has no attribute 'setAge'

如果,我们将方法绑定到class类,则所有实例均可调用:

>>> def setScore(self,score):...     self.score = score...>>> Student.setScore = setSco>>> s.setScore(77)>>> s.score77>>> s2.setScore(88)>>> s2.score88

使用__slots__限制实例添加属性

如果只允许对Student实例添加name和age属性,怎么办?使用__slots__:

>>> class Student(object):...     __slots__ = ('name','age')...>>> s = Student()>>> s.name = 'wc'>>> s.age = 22>>> s.score = 66Traceback (most recent call last):  File "
", line 1, in
AttributeError: 'Student' object has no attribute 'score'

由于score没有被放入__slots__中,所以实例s不能绑定属性score。

要注意:__slots__限制的作用,只对当前类的实例有用,对继承的子类是没有限制作用的:

>>> class GraStudent(Student):...     pass...>>> g = GraStudent()>>> g.score = 88

如果子类也加上__slots__属性,那么子类的实例允许定义的属性就是自身的__slots__加上父类的__slots__:

class GraStudent(Student):    __slots__ = ('addr','tel')>>> g = GraStudent()>>> g.age = 77>>> g.addr = '南京'>>> g.tel = 128>>> g.ip = '12.01'Traceback (most recent call last):  File "
", line 1, in
AttributeError: 'GraStudent' object has no attribute 'ip'

 

posted on
2018-03-07 15:31 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/hiwuchong/p/8522745.html

你可能感兴趣的文章
Vlan 4096的限制原因
查看>>
Windows Phone实用开发技巧(32):照片角度处理
查看>>
数据结构杂题集
查看>>
android 中改变按钮按下时的颜色
查看>>
win7中Android开发环境搭建超详细(百度)
查看>>
遮罩层+软键盘
查看>>
c# 元组Tuple
查看>>
C语言程序试题
查看>>
Ubuntu安装tomcat
查看>>
一、JAVA通过JDBC连接mysql数据库(连接)
查看>>
开发webpart时建立图像文件夹和CSS,js文件夹
查看>>
backbone学习总结(二)
查看>>
ionic + cordova+angularJs 搭建的H5 App完整版总结
查看>>
博客开通了
查看>>
Cloneable接口和循环冗余校验算法
查看>>
Spring事务管理只对出现运行期异常进行回滚
查看>>
清理SQL多余登录信息
查看>>
[Array]189. Rotate Array
查看>>
HTML5的十大新特性
查看>>
简单ajax类, 比较小, 只用ajax功能时, 可以考虑它
查看>>