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实现在windows服务中新建进程的方法
Jun 30 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
Python基于pandas爬取网页表格数据
May 11 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
python某漫画app逆向
Mar 31 Python
python自动化八大定位元素讲解
Jul 09 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分页函数示例代码分享
2014/02/24 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
理解Python中的With语句
2015/02/02 Python
浅析Python中signal包的使用
2015/11/13 Python
Python脚本处理空格的方法
2016/08/08 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
PyTorch中permute的用法详解
2019/12/30 Python
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
学生党支部先进事迹
2014/02/04 职场文书
预备党员表决心书
2014/03/11 职场文书
气象学专业个人求职信
2014/03/15 职场文书
节约用水标语
2014/06/11 职场文书
个人工作总结范文2014
2014/11/07 职场文书
就业推荐表院系意见
2015/06/05 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python