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读写excel的方法
Nov 18 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
Python格式化压缩后的JS文件的方法
Mar 05 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
在Python中处理字符串之isdigit()方法的使用
May 18 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
Tensorflow 查看变量的值方法
Jun 14 Python
浅谈Python访问MySQL的正确姿势
Jan 07 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
Django admin组件的使用
Oct 24 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
判断Python中的Nonetype类型
May 25 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内存释放以及垃圾回收
2018/03/29 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
Python中的闭包总结
2014/09/18 Python
django session完成状态保持的方法
2018/11/27 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
如何定义TensorFlow输入节点
2020/01/23 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
python对一个数向上取整的实例方法
2020/06/18 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
ORACLE十问
2015/04/20 面试题
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
音乐教学反思
2014/02/02 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
助学贷款贫困证明
2014/09/23 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
入党介绍人意见范文
2015/06/01 职场文书
小平小道观后感
2015/06/09 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
vue router 动态路由清除方式
2022/05/25 Vue.js