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中copy()方法的使用
May 21 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
python实现kNN算法
Dec 20 Python
Python建立Map写Excel表实例解析
Jan 17 Python
python实现Zabbix-API监控
Sep 17 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
在Python 的线程中运行协程的方法
Feb 24 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
python re的findall和finditer的区别详解
Nov 15 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 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函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
javascript 写的一个简单的timer
2009/07/30 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
Python isinstance函数介绍
2015/04/14 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
2014年信息宣传工作总结
2014/12/18 职场文书
SqlServer 垂直分表(减少程序改动)
2021/04/16 SQL Server
4种非常实用的python内置数据结构
2021/04/28 Python
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
JavaScript实现队列结构过程
2021/12/06 Javascript
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android