6、类属性和实例属性名字冲突怎么办

修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢?

  1. class Person(object):
  2. address = 'Earth'
  3. def __init__(self, name):
  4. self.name = name
  5.  
  6. p1 = Person('Bob')
  7. p2 = Person('Alice')
  8.  
  9. print 'Person.address = ' + Person.address
  10.  
  11. p1.address = 'China'
  12. print 'p1.address = ' + p1.address
  13.  
  14. print 'Person.address = ' + Person.address
  15. print 'p2.address = ' + p2.address
  1. Person.address = Earth
  2. p1.address = China
  3. Person.address = Earth
  4. p2.address = Earth

当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. __author__ = 'ziv·chan'
  4.  
  5. #把上节的 Person 类属性 count 改为 __count,
  6. #再试试能否从实例和类访问该属性。
  7. class Person(object):
  8. __count = 0
  9. def __init__(self):
  10. Person.__count += 1
  11. print Person.__count
  12.  
  13. try:
  14. p1 = Person()
  15. p2 = Person()
  16.  
  17. print Person.__count
  18. print p1.__count
  19. except AttributeError:
  20. print 'attributeerror'
  1. 1
  2. 2
  3. attributeerror

一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用?

虽然私有属性无法从外部访问,但是,从类的内部是可以访问的(如上)。除了可以定义实例的属性外,还可以定义实例的方法。

实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:

  1. class Person(object):
  2.  
  3. def __init__(self, name):
  4. self.__name = name
  5.  
  6. def get_name(self):
  7. return self.__name

调用实例方法必须在实例上调用:

  1. p1 = Person('Bob')
  2. print p1.get_name() # self不需要显式传入
  3. # => Bob

在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. __author__ = 'ziv·chan'
  4.  
  5. # 给 Person 类增加一个私有属性 __score,表示分数,再增加一个实例方法 get_grade(),
  6. # 能根据 __score 的值分别返回 A-优秀, B-及格, C-不及格三档。
  7.  
  8. class Person(object):
  9.  
  10. def __init__(self,score):
  11. self.__score = score
  12.  
  13. def get_grade(self):
  14. if self.__score >= 80:
  15. return 'A'
  16. elif self.__score <60:
  17. return 'C'
  18. else:
  19. return 'B'
  20.  
  21. p1 = Person(90)
  22. p2 = Person(65)
  23. p3 = Person(80)
  24. print p1.get_grade()
  25. print p2.get_grade()
  26. print p3.get_grade()

结果就不贴了..

Python进阶(面向对象编程基础)(三)的更多相关文章

  1. Python进阶(面向对象编程基础)(二)

    1.初始化实例属性 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'ziv·chan' #定义Person类的__init__方法 ...

  2. Python进阶(面向对象编程基础)(一)

    鉴于昨天被类和函数折腾得晕头转向,今特把类的知识翻出来温习. 1.定义类并创建实力对象 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ ...

  3. Python进阶(面向对象编程基础)(四)

    1.方法也是属性 我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象: class Person(object): def __init__(self, name, score) ...

  4. Python——11面向对象编程基础

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  5. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  6. Python进阶 函数式编程和面向对象编程等

    函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...

  7. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  8. Python基础 — 面向对象编程基础

    目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...

  9. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

随机推荐

  1. 5、第5节课CSS补充和html 标签讲解20150924

    1. DIV 隐藏 A: 隐藏之后不占位置  display:none; B:隐藏之后占位置 visibility:hidden; 2.DIV 排序 z-index:2;  默认是1,如果想DIV在上 ...

  2. 【转】node-webkit:开发桌面+WEB混合型应用的神器

    顾名思义,node-webkit就是nodejs+webkit. 这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS. 快速上手 下载node ...

  3. Ubuntu11.10与r8168网卡不兼容导致网络时断时续的问题

    安装了ubuntu11.10之后,感觉上网啥的很不稳定,ssh连接内网机器也是一条命令卡半天,检查了各方面的原因,网络没有什么问题,最后才发现是网卡驱动的问题,网上搜了一下是由于linux(ubunt ...

  4. xcode 删除 Provisioning Profile

    provisioning profile path: ~/Library/MobileDevice/Provisioning Profiles 打开并日期排序,删除老的 provisioning pr ...

  5. php生成短网址的思路与方法

    生成短网址的思路以及使用php生成短网址的实现方法. 生成短网址的思路:如果把短网址还原了,你知道是个什么样子的吗?比如:http://www.jbxue.com/sitejs-17300-1.htm ...

  6. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

  7. 禁止多行文本框textarea拖拽

    禁止多行文本框textarea拖拽: textarea { resize: none; } resize这个是用于元素缩放,它可以取以下几个值: none 默认值 both 允许水平方向及垂直方向缩放 ...

  8. 自己动手开发编译器(五)miniSharp语言的词法分析器

    稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字 ...

  9. JavaScript常用

    打印日志 console.log 类型判断 第一种方式var type = Object.prototype.toString.call(list);console.log(type);第二种方式ty ...

  10. 使用Reaver加PIN码秒破WPA-PSK密码

    之前掌握到的破解WPA-PSK密码仅限于使用aircreack工具包获取handshake后挂字典爆破方式,而能否破解出wpa密码完全依赖于字典强度了.除了该方式外还有一个更有效的办法,就是使用路由P ...