继承

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

  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. 判断两个View的GRect是否相等

    if (CGRectEqualToRect(self.view.frame, rect)) { // do some stuff }

  2. 使用oracle来计算方差及标准差

    /* Formatted on 5/24/2012 4:15:58 PM (QP5 v5.149.1003.31008) */ SELECT deptno,       ename,          ...

  3. hdu1466 计算直线的交点数

    题意: 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 分析: DP 设状态:f[i][j]表示i条直线能否产生j个 ...

  4. YUI Array 之 indexOf(索引值|搜索)

    YUI原码 YUI indexOfYArray.indexOf = Lang._isNative(Native.indexOf) ? function (array, value, from) { r ...

  5. Yii2.0 UrlManager

    服务器软件的配置与1.0一致即可.. 在组件中进行如下配置: 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' = ...

  6. 无聊写了一个最简单的MVC4+Highcharts连数据库例子

    乱搞了个数据库 后面发现没定INT类型 直接将ID当数据显示了 效果图: 前端 @{ Layout = null; } <!DOCTYPE html> <html> <h ...

  7. java设计模式--创建模式--原型模式

    原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...

  8. json中换行问题

    json中不能存在换行,但可以进行替换后给服务器 function(text_info) { text_info=text_info.replace(/\r/gm,"<br\>& ...

  9. 剑指offer-面试题16.反转链表

    题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点 链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; } 其实 ...

  10. OpenWrt backfire trunk源码下载及编译

    OpenWrt signature check failed remove wrong signature file svn co svn://svn.openwrt.org/openwrt/bran ...