继承

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

  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. Webform Lable

  2. 何时可以开启透明数据加密(TDE)?

    TDE可以为我们的数据库提供加密保护,但是,不是任何情况下都可以随意开启TDE的,同时开启TDE后,我们的数据库维护管理工作也需要进行一些调整. 下面我们就先看看开启TDE需要的条件吧! 无法正常开启 ...

  3. Lucene学习总结之三:Lucene的索引文件格式(1)

    Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...

  4. 把EXCEL列号数字变成字母

    把Excel 列号数字变成字母 private static string ToName(int index) { if (index < 0) { throw new Exception(&q ...

  5. 学了一个封装的jquery插件,感觉还成

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. haproxy之负载均衡算法

    backend     blance 算法 动态hash的特点     服务器运行时就可进行权重调整,即只需要重新载入配置文件即可,不需要重新启动haproxy     支持慢速启动,即重新恢复的后端 ...

  7. HDU 1180 诡异的楼梯(BFS)

    诡异的楼梯 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. C++----练习--while求和

    1.完成1+2+3+...+99+100 #include<iostream> int main() { std::cout<<"本程序完成1 + 2 + 3 ... ...

  9. Multi-Channel MAC for Ad Hoc Networks: Handling Multi-Channel Hidden Terminals Using A Single Transceiver

    MAC协议 2004 这是一个单纯的Multi-Channel Ad Hoc场景,多信道,但不是DSA.没有PU,只是多信道利用问题,相对传统Ad Hoc,要解决的就是1)信道访问(如何使用多个信道) ...

  10. windows对象的属性和方法

    window对象是所有客户端javascript特性和API的主要接入点.它表示web浏览器的一个窗口或窗体,并且可以用标志符window来引用它. 一. windows对象的属性 1. locati ...