面向对象(4)--继承和多态

一、继承

继承的类称为子类,被继承的类称为基类,父类,或超类。

继承的优点:

  • 简化了代码
  • 提高了代码的健壮性
  • 提高了代码的安全性
  • 多态的前提

缺点:耦合与内聚。耦合性越低,内聚性越高,代码越好。

比如,有一个Animal类,有个run方法:

In [1]: class Animal:
   ...:     def run(self):
   ...:         print(‘我正在跑步!!!‘)
   ...:

当我们需要创建Dog和Cat类时,可以直接继承Animal:

In [3]: class Dog(Animal):
   ...:     pass
   ...:

In [4]: class Cat(Animal):
   ...:     pass

由于Animal有run方法,通过继承,Dog和Cat也自动拥有了run方法。

In [5]: dog=Dog()
In [6]: dog.run()
我正在跑步!!!

In [7]: xjm=Cat()
In [8]: xjm.run()
我正在跑步!!!

在·此时你有没有想过,每个动物的run方法都不一样,有飞的,有游的。有跳的,有爬的。

所以我们可以对子类的方法进行重写,而重写后,子类的run方法会覆盖父类的run方法。这样就体现了继承的一个好处:多态。继承正是多态的前提。

In [9]: class Cat(Animal):
   ...:     def run(self):
   ...:         print(‘xjm正在爬呀爬呀!!!‘)
   ...:

In [10]: xjm=Cat()

In [11]: xjm.run()
xjm正在爬呀爬呀!!!

二、多继承

每个孩子都有自己爸爸妈妈,类是否一样呢?多继承:

首先创建一个Father类:

In [18]: class Father():
    ...:     def __init__(self,money):
    ...:         self.money=money
    ...:     def play(self):
    ...:         print(‘我很皮‘)
    ...:     def func(self):
    ...:         print(‘父亲的方法‘)

再创建一个Mother类:

In [19]: class Mother():
    ...:     def __init__(self,faceValue):
    ...:         self.faceValue=faceValue
    ...:     def eat(self):
    ...:         print(‘我是吃货‘)
    ...:     def func(self):
    ...:         print(‘母亲的方法‘)

先来满足这样一个需求,孩子继承Father的钱money。继承Mother的颜值faceValue

再来创建子类来继承Father和Mother:

In [21]: class Child(Father,Mother):
    ...:     def __init__(self,money,faceValue):
    ...:         Father.__init__(self,money)
    ...:         Mother.__init__(self,faceValue)

最后来实现一下:

In [23]: c=Child(30000,99)

In [24]: c.money
Out[24]: 30000

In [25]: c.faceValue
Out[25]: 99

In [26]: c.play()
我很皮

In [27]: c.eat()
我是吃货

In [28]: c.func()
父亲的方法

说明:父类中方法名相同,默认调用的是括号中排前面的父类中的方法。

三、多态

概念:一种事物的多种形态

要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样:

In [12]: a=list()

In [13]: b=Animal()

In [14]: c=Cat()

In [15]: isinstance(a,list)
Out[15]: True

In [16]: isinstance(c,Cat)
Out[16]: True

In [17]: isinstance(c,Animal)
Out[17]: True

从上面代码可以看出,c对象既属于Cat类,又属于Animal类。

那么多态有什么好处呢?通过一下一个事例来一一说明:

class Person():
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender
    def who(self):
        print(‘我是一个人,我的名字是%s‘%self.name)

class Student(Person):
    def __init__(self,name,gender,score):
        super(Student,self).__init__(name,gender)
        self.score=score
    def who(self):
        print(‘我是一名学生,我的名字是%s‘%self.name)
class Teacher(Person):
    def __init__(self,name,gender,course):
        super(Teacher,self).__init__(name,gender)
        self.course=course
    def who(self):
        print(‘我是一名老师,我的名字是%s‘%self.name)
def who(x):
    x.who()
a=Person(‘小狗‘,‘女‘)
b=Student(‘小猫‘,‘男‘,99)
c=Teacher(‘小鸡‘,‘不男不女‘,‘python‘)
who(a)
who(b)
who(c)

我是一个人,我的名字是小狗
我是一名学生,我的名字是小猫
我是一名老师,我的名字是小鸡

 

原文地址:https://www.cnblogs.com/xjmlove/p/9094763.html

时间: 2024-10-12 11:24:41

面向对象(4)--继承和多态的相关文章

javascript面向对象:继承、多态

继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属性),同时可扩展自己的成员,下面介绍几种js中实现继承的方式: 1,对象模仿:通过动态的改变 this 指针的指向,实现对父类成员的重复定义,如下: function ClassA(paramColor) { this.color = paramColor; this.sayColor = function() { alert(this.color); } } function ClassB(paramColor,

php 面向对象之继承、多态和静态方法

<?php //继承:子类可以继承父类的一切 //特点:单继承 //父类 class Ren { public $name; public $sex; public $yuyan; function Say() { echo $this->name."正在讲话!"; } } //美国人的子类 class America extends Ren { public $ziben; //子类对父类的方法重写 function Say() { parent::Say(); //调用

Python 面向对象编程——继承和多态

1.1   继承和多态 1.1.1   继承 当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). >>> class Animal(object): ...    def run(self): ...        print('Animal is running...') #父类 ... >>> class Dog(Ani

PHP中面向对象的继承和多态基本用法

Extends 继承: 特点:单继承 一个子类只能有一个父类,一个父类可以有多个子类 例子: Class Ren { Public $name; Public $sex; Public $yuyan; Function say() { Echo $this->name.”正在讲话”: } } 美国人的子类: Class amercia extends Ren { Function say() { Parent::say();    调用父类的say()方法 Echo “hello”;    子类

面向对象:继承、多态

1.继承   子类名:父类名 子类可以继承父类所有的公共方法和属性 一个父类可以有无数个子类.后辈类 一个子类只能有一个亲爹 父类.基类子类.派生类.超类        --不同种说法 2.多态 virtual   虚方法 override  重写 overload 重载 用法: class grandfa { public string p() { return "奶奶"; } } -- class father:grandfa { public virtual string peo

面向对象编程——继承和多态(四)

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). 比如我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): #为啥没有__init__,因为不需要初始化,就self一个参数. print("Animal is running.

python 面向对象四 继承和多态

一.继承 1 class Animal(object): 2 def run(self): 3 print('Animal is running...') 4 5 class Dog(Animal): 6 7 def run(self): 8 print('Dog is running...') 9 10 def eat(self): 11 print('Eating meat...') 12 13 dog = Dog() 14 dog.run() 1 Dog is running... 当子类

面向对象(继承,多态)

二维数组的定义格式:第一种:直接给定了每一个一维数组中数组长度数据类型[][] 数组名称 = new 数据类型[m][n]第二种:给定了多少个一维数组,长度动态给定数据类型[][] 数组名称 = new 数据类型[m][] ;第三种:二维数组中直接给定元素值数据类型[][] 数组名称 = {{元素1,元素2},{元素1,元素2}-} 如何遍历二维数组 int [][] arr = {{11,22},{33,44},{55,66}} ; 外层循环:控制的是二维数组长度,内存循环,一维数组长度 代码

Java面向对象,继承,多态

1,继承 Java 中通过 extends 关键字可以继承一个类,implements可以继承多个接口.继承允许创建等级层次的类. 继承的机制提高了代码的复用性,让类与类之间产生了关系,有了这个关系,才有了多态的特性. 注:Java支持单继承,但是可以多层继承. 子类可以拥有父类的非private的方法和属性,子类可以继承父类的方法,也可以重写父类的方法,还可以对父进行拓展. 增加了类之间的联系,即提高了耦合. 一般格式为: class 父类 { } class 子类 extends 父类 {