Python中的面向对象编程详解(下)


Posted in Python onApril 13, 2015

继承

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

class SubClassName (ParentClass1[, ParentClass2, ...]):

    'optional class documentation string'

    class_suite

实例
class Parent(object): # define parent class 定义父类

    def parentMethod(self):

    print 'calling parent method'
class Child(Parent): # define child class 定义子类

    def childMethod(self):

    print 'calling child method'

继承与覆盖

继承

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

class Parent():

    def __init__(self):

        print "init Parent class instance"
    def func(self):

        print "call parent func"
class Child(Parent):

    def __init__(self):

        print "init Child class instance"
child = Child()

child.func()

输出
init Child class instance 

call parent func

super关键字

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

super(type[, obj])

示例
class C(B):

    def method(self, arg):

        super(C, self).method(arg)

注意

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

class Parent(object):

    def __init__(self):

        self.phone = '123456'

        self.address = 'abcd'
class Child(Parent):

    def __init__(self):

        super(Child, self).__init__()

        self.data = 100
def main():

    child = Child()

    print "phone is: ", child.phone

    print "address is: ", child.address

    print "data is: ", child.data
if __name__ == '__main__':

    main()

输出
phone is:  123456

address is:  abcd

data is:  100

重写

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

class Parent():

def __init__(self):

print "init Parent class instance"

def func(self):

print "call parent func"

class Child(Parent):

def __init__(self):

print "init Child class instance"
child = Child()

child.func()

输出
init Child class instance

call Child func

多重继承

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

class Father():

    def __init__(self):

        print "init Father instance"
class Mother():

    def __init__(self):

        print "init Mother instance"
class Child(Father, Mother):

    pass

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

issubclass()

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

issubclass(sub, sup)

isinstance()

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

isinstance(obj1, obj2)

attr()系列函数

●hasattr()
它的目的就是为了决定一个对象是否有一个特定的属性,一般用于访问某属性前先作一下检查。
●getattr()和setattr()
●getattr()和 setattr()函数相应地取得和赋值给对象的属性,

●delattr()
删除特定的属性

实例

class Child(Parent):

    def __init__(self):

        self.data = 100
child = Child()

print "has data attr?", hasattr(child, 'data')
print "delete attr"

delattr(child, 'data')
print "has data attr?", hasattr(child, 'data')
print "set data attr to 200"

setattr(child, 'data', 200)

print "data attr is: ", getattr(child, 'data')

输出
has data attr? True

delete attr

has data attr? False

set data attr to 200

data attr is:  200

私有化

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

●双划线
防止外部访问.如在func前加双划线,可以防止包括子类的实例的访问.

    def __func(self):

        print "call"

●单划线
防止模块的属性用“from mymodule import *”来加载。
Python 相关文章推荐
收集的几个Python小技巧分享
Nov 22 Python
Python Nose框架编写测试用例方法
Oct 26 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
Python实现合并两个有序链表的方法示例
Jan 31 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
Python高级特性 切片 迭代解析
Aug 23 Python
python实现贪吃蛇双人大战
Apr 18 Python
python查询MySQL将数据写入Excel
Oct 29 Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 Python
Python中三种花式打印的示例详解
Mar 19 Python
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 #Python
Python中的面向对象编程详解(上)
Apr 13 #Python
进一步理解Python中的函数编程
Apr 13 #Python
Python中的异常处理简明介绍
Apr 13 #Python
python中的装饰器详解
Apr 13 #Python
Python生成器(Generator)详解
Apr 13 #Python
Python中函数的多种格式和使用实例及小技巧
Apr 13 #Python
You might like
如何写php程序?
2006/12/08 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
jQuery使用手册之一
2007/03/24 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
JavaScript中实现最高效的数组乱序方法
2014/10/11 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
jquery判断输入密码两次是否相等
2020/04/22 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
python中的__slots__使用示例
2015/02/26 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
大学运动会加油稿
2015/07/22 职场文书