绑定属性

从之前的文章中,我们知道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__的更多相关文章

  1. python 给对象绑定属性和方法和__slots__的使用

    # 以c语言为主是静态语言,运行之前先编译,在运行的过程中不允许编辑代码# 在运行的过程中,可以改变,可以添加属性,就是属于动态语言(python) # python动态的添加属性以及方法class ...

  2. Python面向对象(类的成员之属性)

    day24 类的成员之属性 class Foo(): def bar(self): print("bar") @property def per(self): ') return ...

  3. Django学习路21_views函数中定义字典及html中使用类实例对象的属性及方法

    创建 app6 在项目的 settings 中进行注册 INSTALLED_APPS 里面添加 'app6.apps.App6Config' 在 app6 的models.py 中创建数据表 clas ...

  4. Python的类实例属性访问规则

    一般来说,在Python中,类实例属性的访问规则算是比较直观的. 但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此. 在这里,我们需要明白以下几个地方: 1.Pytho ...

  5. Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

    1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...

  6. Python面向对象的特征跟私有属性

     面向对象的三大特征 继成.封装.多态: 继承:一个类可以继承一个或多个类,被继承的类叫做父类,继承的类叫做子类 封装:将数据和方法放在了一个类中就构成了封装 多态:指的一类事物有多重形态,一个抽象类 ...

  7. 026.Python面向对象类的相关操作以及对象和类的删除操作

    类的相关操作 定义的类访问共有成员的成员和方法 定义的类动态添加公有成员的属性和方法 定义的类删除公有成员的属性和方法 1 定义一个基本的类 #定义一个类 class Plane(): #添加一个共有 ...

  8. Python面向对象静态方法,类方法,属性方法

    Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...

  9. Python面向对象 | 类的成员

    一. 细分类的组成成员 之前咱们讲过类大致分两块区域,静态字段部分和方法部分. 每个区域详细划分又可以分为: class A: company = '阿里巴巴' # 静态变量(静态字段) __tel ...

  10. vue第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件)

    第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件) #课程目标 掌握vue实例的相关属性和方法的含义和使用 了解vue的数据响应原理 熟悉创建组件,了解全局 ...

随机推荐

  1. github下载历史版本--xdd

    第一步 打开一个仓库,可以看到此时在主分支下,点击1位置查看历史版本 第二步 现在可以查看到所有的版本(提交)信息,单击2位置进入该版本 第三步 单击3位置浏览并打开该版本 第四步 进入该版本之后,可 ...

  2. BeautifulSoup模块的常用方法小结

    Beautiful Soup库是解析.遍历.维护“标签树”的功能库. url = "http://desk.zol.com.cn/" request = requests.get( ...

  3. LESSON 3- Discrete Memory-less Sources

    1.     Entropy H[X] - bounds on Lmin 2.      Huffman’s algorithm for optimal source code

  4. 删除排序数组中的重复项II

    Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...

  5. 压缩打包介绍、gzip、bzip2、xz压缩工具

    第5周第1次课(4月16日) 课程内容: 6.1 压缩打包介绍6.2 gzip压缩工具6.3 bzip2压缩工具6.4 xz压缩工具 6.1 压缩打包介绍 为什么要给文件进行压缩呢?首先压缩和不压缩空 ...

  6. C# MVC 过滤器

    APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器 ...

  7. 深入 .NET Core 基础 - 1:deps.json, runtimeconfig.json 以及 dll

    深入 .NET Core 基础:deps.json, runtimeconfig.json 以及 dll 原文地址:https://natemcmaster.com/blog/2017/12/21/n ...

  8. js点击历史记录

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 【开发记录】Linux常用命令记录(一)【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  10. 配置基于接口地址池的DHCP

    配置基于接口地址池的DHCP 原理概述 DHCP(动态主机配置协议),采用C/S方式工作,C向S动态请求配置信息,S自动分配配置信息. 基于接口地址池的DHCP服务器,链接这个接口网段的用户都可以从该 ...