继承

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

  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. oc基础 不可变字符串的创建和使用

    oc基础  不可变字符串的创建和使用 简介:下面都是字符串基本用法. 1.字符串的创建 //创建oc常量字符串 NSString *str=@"hello world!"; NSL ...

  2. 1.想写一些关于c++的东西了,就作为个开篇吧

    又再一次重拾c++,想写一些东西,给自己看看,不想再看一些隐晦翻译的外国书籍了,就从一本好读的书开始写一写. 就这本吧, <我的第一本C++书>> 来写一写自己的东西.

  3. sizeof对int long double char的使用

    主要针对int long char double 字节长度的识记. 1 #include <stdio.h> 2 3 int main() 4 { 5 int a[100]; 6 int ...

  4. Myeclipse中如何修改Tomcat的端口号

    一,使用 Myeclipse 中自带的 tomcat 右键 configure 弹出窗口 在 port Number 中修改 端口号即可: 二,配置的 tomcat 如果用上述的方法,只能打开这样的窗 ...

  5. py正则表达式

    1.元字符 . ^ $ * + ? {} [] \ | () --> [] :   - 常用来指定一个字符集:[abc], [a-z]  匹配任意一个字符 - 元字符在字符集中不起作用:[akm ...

  6. 用JSON 和 Google 实现全文翻译

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  7. SqlServer sysobjects_table

    --这是查询所有表的信息 select * from sysobjects where xtype='U'; --这是查询表的数量 select count(*) from sysobjects wh ...

  8. java实现文件编码监测

    java实现文件编码监测 最近在做一个文档的翻译项目,可文档的编码不知道,听头疼的.尝试了很多方法最后发现JCharDet这个工具可以轻松解决这个问题.于是作此笔记希望日后提醒自己以及帮助又需要的人. ...

  9. 2014第2周三Web安全学习

    2014第2周三Web安全学习 先记录下自己关于json和xml作为数据传递媒介的差异:在写一个java方法时我将正确结果返回的对象转成json返回,将错误结果根据不同原因以xml形式返回,同事看后有 ...

  10. Ice笔记-利用Ice::Application类简化Ice应用

    Ice笔记-利用Ice::Application类简化Ice应用 作者:ydogg,转载请申明. 在编写Ice相关应用时,无论是Client还是Server端,都必须进行一些必要的动作,如:Ice通信 ...