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正则表达式操作指南(re使用)
Sep 06 Python
python根据日期返回星期几的方法
Jul 06 Python
浅析python递归函数和河内塔问题
Apr 18 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
Python代码太长换行的实现
Jul 05 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
Django重设Admin密码过程解析
Feb 10 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
Python变量格式化输出实现原理解析
Aug 06 Python
详解Python中的Lock和Rlock
Jan 26 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容易忘记的知识点分享
2013/04/30 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
哪些是python中web开发框架
2020/06/17 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
python 8种必备的gui库
2020/08/27 Python
Python 多进程原理及实现
2020/12/21 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
部队领导证婚词
2014/01/12 职场文书
秋季运动会稿件
2014/01/30 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
会计试用期自我评价
2015/03/10 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书