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 14 Python
Python3实现的字典遍历操作详解
Apr 18 Python
对pandas replace函数的使用方法小结
May 18 Python
python flask实现分页的示例代码
Aug 02 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
利用python将图片版PDF转文字版PDF
May 03 Python
python sqlite的Row对象操作示例
Sep 11 Python
python 字典访问的三种方法小结
Dec 05 Python
python3 实现调用串口功能
Dec 26 Python
tensorflow之自定义神经网络层实例
Feb 07 Python
python如何实现单链表的反转
Feb 10 Python
python给list排序的简单方法
Dec 10 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的引用原因分析
2012/09/06 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
脚本合并提升javascript性能示例
2014/02/24 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
python抓取网页内容示例分享
2014/02/24 Python
Python三级目录展示的实现方法
2016/09/28 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
python实现超市商品销售管理系统
2019/10/25 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
物流仓管员工作职责
2014/01/06 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
大学生求职信例文
2014/06/29 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
会计求职简历自我评价
2015/03/10 职场文书
公司职员入党自传书
2015/06/26 职场文书