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中使用dict和set方法的教程
Apr 27 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
Django自定义认证方式用法示例
Jun 23 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
Python整数对象实现原理详解
Jul 01 Python
使用python实现多维数据降维操作
Feb 24 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
python如何利用traceback获取详细的异常信息
Jun 05 Python
Python中字符串对象语法分享
Feb 24 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
同时提取多条新闻中的文本一例
2006/10/09 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
NodeJS实现同步的方法
2019/03/02 NodeJs
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python实现连连看游戏
2020/02/14 Python
Python如何读取、写入CSV数据
2020/07/28 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
Delphi CS笔试题
2014/01/04 面试题
高三历史教学反思
2014/01/09 职场文书
大学社团活动策划书
2014/01/26 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
护理专业自荐信范文
2015/03/06 职场文书
个人总结与自我评价2015
2015/03/11 职场文书
惊天动地观后感
2015/06/10 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL