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发送arp欺骗攻击代码分析
Jan 16 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
Python中使用logging模块打印log日志详解
Apr 05 Python
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
python计算时间差的方法
May 20 Python
python添加模块搜索路径方法
Sep 11 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
序列化Python对象的方法
Aug 01 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 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初学者头疼问题总结
2006/07/08 PHP
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
电脑教师的自我评价
2013/12/18 职场文书
宿舍使用违章电器检讨书
2014/01/12 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
年会主持词结束语
2014/03/27 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
秋冬农业生产标语
2014/10/09 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
Python保存并浏览用户的历史记录
2022/04/29 Python