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文件写入实例分析
Apr 08 Python
Python计算一个文件里字数的方法
Jun 15 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
Django压缩静态文件的实现方法详析
Aug 26 Python
python梯度下降法的简单示例
Aug 31 Python
kafka-python批量发送数据的实例
Dec 27 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
python binascii 进制转换实例
Jun 12 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
Python异常类型以及处理方法汇总
Jun 05 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 前一天或后一天的日期
2008/06/28 PHP
php 静态变量的初始化
2009/11/15 PHP
PHP自定义函数收代码
2010/08/01 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
onpropertypchange
2006/07/01 Javascript
学习YUI.Ext 第二天
2007/03/10 Javascript
js 数值项目的格式化函数代码
2010/05/14 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
python中的数据结构比较
2019/05/13 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
三孔导游词
2015/02/05 职场文书
canvas实现贪食蛇的实践
2022/02/15 Javascript
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers