Python面向对象-类、实例的绑定属性、绑定方法和__slots__
绑定属性
从之前的文章中,我们知道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.age
66
我们来验证一下,给一个实例绑定的方法,对另外一个实例有作用吗:
>>> s2 = Student()
>>> s2.setAge
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'setAge'
如果,我们将方法绑定到class类,则所有实例均可调用:
>>> def setScore(self,score):
... self.score = score
...
>>> Student.setScore = setSco
>>> s.setScore(77)
>>> s.score
77
>>> s2.setScore(88)
>>> s2.score
88
使用__slots__限制实例添加属性
如果只允许对Student实例添加name和age属性,怎么办?使用__slots__:
>>> class Student(object):
... __slots__ = ('name','age')
...
>>> s = Student()
>>> s.name = 'wc'
>>> s.age = 22
>>> s.score = 66
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
AttributeError: 'GraStudent' object has no attribute 'ip'
Python面向对象-类、实例的绑定属性、绑定方法和__slots__的更多相关文章
- python 给对象绑定属性和方法和__slots__的使用
# 以c语言为主是静态语言,运行之前先编译,在运行的过程中不允许编辑代码# 在运行的过程中,可以改变,可以添加属性,就是属于动态语言(python) # python动态的添加属性以及方法class ...
- Python面向对象(类的成员之属性)
day24 类的成员之属性 class Foo(): def bar(self): print("bar") @property def per(self): ') return ...
- Django学习路21_views函数中定义字典及html中使用类实例对象的属性及方法
创建 app6 在项目的 settings 中进行注册 INSTALLED_APPS 里面添加 'app6.apps.App6Config' 在 app6 的models.py 中创建数据表 clas ...
- Python的类实例属性访问规则
一般来说,在Python中,类实例属性的访问规则算是比较直观的. 但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此. 在这里,我们需要明白以下几个地方: 1.Pytho ...
- Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量
1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...
- Python面向对象的特征跟私有属性
面向对象的三大特征 继成.封装.多态: 继承:一个类可以继承一个或多个类,被继承的类叫做父类,继承的类叫做子类 封装:将数据和方法放在了一个类中就构成了封装 多态:指的一类事物有多重形态,一个抽象类 ...
- 026.Python面向对象类的相关操作以及对象和类的删除操作
类的相关操作 定义的类访问共有成员的成员和方法 定义的类动态添加公有成员的属性和方法 定义的类删除公有成员的属性和方法 1 定义一个基本的类 #定义一个类 class Plane(): #添加一个共有 ...
- Python面向对象静态方法,类方法,属性方法
Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...
- Python面向对象 | 类的成员
一. 细分类的组成成员 之前咱们讲过类大致分两块区域,静态字段部分和方法部分. 每个区域详细划分又可以分为: class A: company = '阿里巴巴' # 静态变量(静态字段) __tel ...
- vue第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件)
第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件) #课程目标 掌握vue实例的相关属性和方法的含义和使用 了解vue的数据响应原理 熟悉创建组件,了解全局 ...
随机推荐
- linux网络配置(iproute2)
iproute2家族 ip命令:show / manipulate routing,devices,policy routing and tunnels(显示/操纵路由.设备.策略路由和隧道) 语法 ...
- 2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)
>传送门< 题意:最初有 n个人且互不认识,接下来 m行,每行有 x,y表示x和y交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 思路:比赛的时候知道是用并 ...
- .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇
.NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇 本文作为初级篇,适合已经安装好.NET Core 环境以及 Gtk 环境,并具备了 C#开发基础知识,能跑一些简单的例子,希望更 ...
- 【Android - 自定义View】之View的draw过程解析
draw(绘制)过程的作用是将View绘制到屏幕上面.View中有 draw() 方法和 onDraw() 方法,但onDraw()方法是空方法:ViewGroup中没有draw()方法,也没有onD ...
- centos7安装samba
samba是一个实现smb协议的开源软件,为局域网内的不同计算机之间提供文件和打印机共享服务. 1.安装yum groupinstall “file-server” -y 2.配置cp /etc/sa ...
- Dropzone.js拖拽上传(简单示例)
今天碰到一个需求,页面上有“点击上传”的按钮,点击可以执行上传事件,从桌面拖拽图片拖拽到任何地方,都可以执行上传,且不影响点击按钮事件.下面是简单示例: 简单示例如下: <!DOCTYPE ht ...
- Grok Debugger安装配置
前言:由于使用ELK对日志进行集中管理,grok表达式无法验证是否正确,所以使用Grok Debugger进行调试,但是由于国外网站上不去(http://grokdebug.herokuapp.com ...
- Spring Cloud Hoxton正式发布,Spring Boot 2.2 不再孤单
距离Spring Boot 2.2.0的发布已经有一个半月左右时间,由于与之匹配的Spring Cloud版本一直没有Release,所以在这期间碰到不少读者咨询的问题都是由于Spring Boot和 ...
- MySQL的存储(一、连接数据库)
准备工作: 确保安装MySql 安装PyMySQL库 连接数据库: 这里首先尝试连接下数据库,假设当前MySQL运行在本地,用户名为root,密码为123456,运行端口为3306. 通过PyMySQ ...
- KubeSphere 日志备份与恢复实践
为什么需要日志备份 KubeSphere 日志系统使用 Fluent Bit + ElasticSearch 的日志采集存储方案,并通过 Curator 实现对 Index 的生命周期管理,定期清理久 ...