Python面向对象之继承代码详解

作者:世界看我我看世界 时间:2022-03-11 03:04:24 

本文研究的主要是Python面向对象之继承的相关内容,具体如下。

Python 继承

即一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计,一个Cat类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例如,Cat是一个Animal)。

继承实现了代码的重用。

继承的基本语法:

class 派生类名(基类名1 [, 基类名2....]):

基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。

多重继承

Python支持多重继承,也就是一个子类可以有多个父类,父类间用逗号隔开。

在多重继承中,子类有那么多的父类,那子类实例化时,构造方法是怎样调用的呢?

这里需要记住一点:

多重继承中,构造方法以第一个父类为中心。如果子类重新定义了构造方法,就不会调用父类的构造方法,构造就会只调用第一个父类的构造方法,并且如果父类中有同名的方法时,通过子类的实例对象去调用的该方法也是第一个父类中的方法。当然如果你需要在子类中用来某个或某几个父类的构造方法,需要显示的去调用父类的构造方法。

在python中继承中的一些特点:

  1. 在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

  2. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数。

  3. Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

  4. 子类只继承父类所有公有的属性和方法,并且也可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。

实例:


class Parent(object): # define parent class
parentAttr = 100
def __init__(self):
 print "Calling parent constructor"

def parentMethod(self):
 print 'Calling parent method'

def setAttr(self, attr):
 Parent.parentAttr = attr

def getAttr(self):
 print "Parent attribute :", Parent.parentAttr

class Child1(Parent): # define child1 class
def __init__(self):
 print "Calling child1 constructor"

def childMethod(self):
 print 'Calling child1 method'
 Parent.parentMethod(self) #调用基类的方法,所以要加上参数self

class Child2(Parent): # define child2 class
def childMethod(self):
 print 'Calling child2 method'
 self.parentMethod() #子类调用自己从父类那继承过来的父类的方法

c1 = Child1() # 实例化子类 1
c2 = Child2() # 实例化子类 2
c1.childMethod() # 调用子类的方法
c2.childMethod() # 调用子类的方法
c1.parentMethod() # 调用父类方法
c1.setAttr(200) # 再次调用父类的方法
c1.getAttr() # 再次调用父类的方法

执行结果:

Calling child1 constructor
Calling parent constructor
Calling child1 method
Calling parent method
Calling child2 method
Calling parent method
Calling parent method
Parent attribute : 200

解析:


c1 = Child1() # 实例化子类 1
c2 = Child2() # 实例化子类 2

这两句是创建Child1类和Child2类的实例对象,创建实例对象时,就会自动去调类的构造方法,如果子类中没有建立自己的构造方法,就会调用父类的构造方法,所以打印结果为:

Calling child1 constructor
Calling parent constructor

c1.childMethod() # 调用子类的方法
c2.childMethod() # 调用子类的方法

上面两句分别调用的是对应子类的子类方法,由于在子类中都分别有调用父类的方法,所以打印结果为:

Calling child1 method
Calling parent method
Calling child2 method
Calling parent method

注意:

子类继承父类以后,如果在子类在对父类的方法进行改造时,由需要用到父类的方法时,这个时候在子类中想要调用父类的方法时,该怎么做呢?有两种方法:

  1. Parent.parentMethod(self)

  2. self.parentMethod()

第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的时,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向指向这个类的实例本身。

第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。

使用issubclass()或者isinstance()方法来检测类之间的关系:

  1. issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类, 语法:issubclass(sub,sup)

  2. isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。

来源:http://blog.csdn.net/seetheworld518/article/details/48810183

标签:python,面向对象,继承
0
投稿

猜你喜欢

  • Python获取"3年前的今天"的日期时间问题

    2022-02-01 12:12:13
  • 解决Python pandas plot输出图形中显示中文乱码问题

    2023-03-14 21:39:59
  • python实现飞机大战小游戏

    2022-05-05 05:14:46
  • 详解Python字典查找性能

    2022-05-06 10:45:34
  • CSS解决未知高度的垂直水平居中自适应问题

    2009-03-17 17:06:00
  • 浏览器调试动态js脚本的方法(图解)

    2023-07-06 22:51:08
  • 详解如何用Python模拟登录淘宝

    2023-09-29 19:07:34
  • Selenium 滚动页面至元素可见的方法

    2022-06-01 14:01:05
  • 利用python爬取斗鱼app中照片方法实例

    2022-01-03 17:40:39
  • Python+matplotlib实现折线图的美化

    2023-09-05 20:03:18
  • python爬虫获取京东手机图片的图文教程

    2023-12-24 08:29:21
  • python计算机视觉OpenCV库实现实时摄像头人脸检测示例

    2022-05-17 22:41:50
  • python time.strptime格式化实例详解

    2022-03-25 19:13:02
  • 使用Python手工计算x的算数平方根,来自中国古人的数学智慧

    2021-12-07 01:29:53
  • 基于Python的图像数据增强Data Augmentation解析

    2022-12-21 11:50:31
  • Python实现拼接多张图片的方法

    2022-07-22 12:58:13
  • Python之二维正态分布采样置信椭圆绘制

    2021-04-08 06:39:09
  • asp被杀毒软件误删的解决方法

    2011-04-11 11:16:00
  • 如何列出我所需要数据视图?

    2010-01-12 20:00:00
  • Python批量处理csv并保存过程解析

    2022-07-04 16:17:02
  • asp之家 网络编程 m.aspxhome.com