继承

继承描述了基类的属性如何“遗传”给派生类。一个子类可以继承它的基类的任何属性,不管是数据属性还是方法。
创建子类的语法看起来与普通(新式)类没有区别,一个类名,后跟一个或多个需要从其中派生的父类:

  1. class SubClassName (ParentClass1[, ParentClass2, ...]):
  2. 'optional class documentation string'
  3. class_suite

实例

  1. class Parent(object): # define parent class 定义父类
  2. def parentMethod(self):
  3. print 'calling parent method'
  4. class Child(Parent): # define child class 定义子类
  5. def childMethod(self):
  6. print 'calling child method'

继承与覆盖

继承

不同于Java,python的子类继承父类后,会把父类的所有的方法,包括构造器init()也继承下来.

  1. class Parent():
  2. def __init__(self):
  3. print "init Parent class instance"
  4. def func(self):
  5. print "call parent func"
  6. class Child(Parent):
  7. def __init__(self):
  8. print "init Child class instance"
  9. child = Child()
  10. child.func()

输出

init Child class instance
call parent func

super关键字

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。语法如下

super(type[, obj])

示例

  1. class C(B):
  2. def method(self, arg):
  3. super(C, self).method(arg)

注意

super继承只能用于新式类,用于经典类时就会报错。
新式类:必须有继承的类,如果没什么想继承的,那就继承object
经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』

实例

  1. class Parent(object):
  2. def __init__(self):
  3. self.phone = '123456'
  4. self.address = 'abcd'
  5. class Child(Parent):
  6. def __init__(self):
  7. super(Child, self).__init__()
  8. self.data = 100
  9. def main():
  10. child = Child()
  11. print "phone is: ", child.phone
  12. print "address is: ", child.address
  13. print "data is: ", child.data
  14. if __name__ == '__main__':
  15. main()

输出

  1. phone is: 123456
  2. address is: abcd
  3. data is: 100

重写

子类只要重新定义一个与父类的方法同名的方法,就可以重写覆盖父类的方法. 子类只要把上例父类的func(self)重写就行了.

  1. class Parent():
  2. def __init__(self):
  3. print "init Parent class instance"
  4. def func(self):
  5. print "call parent func"
  6. class Child(Parent):
  7. def __init__(self):
  8. print "init Child class instance"
  9. child = Child()
  10. child.func()

输出

  1. init Child class instance
  2. call Child func

多重继承

同 C++一样,Python 允许子类继承多个基类。但一般不推荐用多重继承.语法如下:

  1. class Father():
  2. def __init__(self):
  3. print "init Father instance"
  4. class Mother():
  5. def __init__(self):
  6. print "init Mother instance"
  7. class Child(Father, Mother):
  8. pass

类、实例和其他对象的内建函数

issubclass()

布尔函数判断一个类是另一个类的子类或子孙类。它有如下语法:

issubclass(sub, sup)

isinstance()

布尔函数在判定一个对象是否是另一个给定类的实例时,非常有用。它有如下语法:

isinstance(obj1, obj2)

attr()系列函数

  • hasattr()
    它的目的就是为了决定一个对象是否有一个特定的属性,一般用于访问某属性前先作一下检查。

  • getattr()和setattr()
    getattr()和 setattr()函数相应地取得和赋值给对象的属性,

  • delattr()
    删除特定的属性

实例

  1. class Child(Parent):
  2. def __init__(self):
  3. self.data = 100
  4. child = Child()
  5. print "has data attr?", hasattr(child, 'data')
  6. print "delete attr"
  7. delattr(child, 'data')
  8. print "has data attr?", hasattr(child, 'data')
  9. print "set data attr to 200"
  10. setattr(child, 'data', 200)
  11. print "data attr is: ", getattr(child, 'data')

输出

  1. has data attr? True
  2. delete attr
  3. has data attr? False
  4. set data attr to 200
  5. data attr is: 200

私有化

Python没有像Java那样实现真正的封装,只是用双划线和单划线实现私有化.

  • 双划线
    防止外部访问.如在func前加双划线,可以防止包括子类的实例的访问.
    1. def __func(self):
    2. print "call"
  • 单划线
    防止模块的属性用“from mymodule import *”来加载。

python面向对象(下)的更多相关文章

  1. Python 面向对象(下)

    本篇博客承接自Python 面向对象(上) 四. 继承,实现,依赖,关联,聚合,组合 Python面向对象--继承,实现,依赖,关联,聚合,组合 五. 特殊成员 Python面向对象--类的特殊成员 ...

  2. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  3. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  4. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  5. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  6. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

  7. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  8. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  9. python面向对象进阶(八)

    上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

随机推荐

  1. Ubuntu安装samba服务器

    一.安装软件 sudo apt-get install samba 二.配置samba服务器/etc/samba/smb.conf 把默认的配置文件备份,按如下修改配置文件 [global] work ...

  2. JS多选日期

    项目需要一个可以选择多个日期的日期选择框,从网上找到一个单选的选择框源码 (http://blog.5d.cn/user2/samuel/200503/61881.html),修改成可以多选. 使用方 ...

  3. [Head First Python]4. summary

    1- strip()方法可以从字符串去除不想要的空白符 (role, line_spoken) = each_line.split(":", 1) line_spoken = li ...

  4. uWSGI

    参考:http://perlmaven.com/deploying-pyton-with-uwsgi-on-ubuntu-13-10

  5. Android创建和使用数据库详细指南(1)

    http://database.51cto.com/art/200903/113334.htm 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你 ...

  6. linux下休眠/待机命令

    http://blog.csdn.net/hshl1214/article/details/6228275

  7. Keil C -WARNING L15: MULTIPLE CALL TO SEGMENT

    1.第一种错误信息 ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1: ...

  8. 如何不保存Word即可用Word打开想显示的内容!

    今天遇到客户需要将数据用Word预览,原来做的时候是保存到本地然后打开,客户说这样不好,因为不一定预览了一定要保存,于是我翻箱倒柜的发现真没资料啊!!幸好经过我的大量实验(好吧,我是挨个方法试的!), ...

  9. shell printf格式化输出语句

    printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...

  10. RTP 包格式 详细解析

    H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+      |0|1|2|3|4|5|6|7 ...