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中使用SQLite的简单教程
Apr 29 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
Python一行代码实现快速排序的方法
Apr 30 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Python 代码调试技巧示例代码
Aug 11 Python
python利用faker库批量生成测试数据
Oct 15 Python
Python机器学习之PCA降维算法详解
May 19 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
Python Pandas常用函数方法总结
Jun 15 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统一页面编码避免乱码问题
2015/04/09 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
php设计模式之单例模式代码
2016/06/11 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
js实现全选和全不选功能
2020/07/28 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
Python操作MySQL数据库的方法
2018/06/20 Python
python保存文件方法小结
2018/07/27 Python
python如何实现视频转代码视频
2019/06/17 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
python新手学习可变和不可变对象
2020/06/11 Python
如何对python的字典进行排序
2020/06/19 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
税务会计岗位职责
2014/02/18 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
Python闭包的定义和使用方法
2022/04/11 Python
使用Ajax实现无刷新上传文件
2022/04/12 Javascript
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS