python中的继承和多态

继承

继承的表现方式:

class Animal():
    pass
class Cat(Animal):  #animal是cat的父类,也可以说是基类
    pass
print(Cat.__bases__)#查看Cat的所有父类

单继承

一个类只有一个父类

狗和鸟都是动物,都拥有吃喝这两种技能,但游泳是狗的特殊技能,飞逝鸟的特殊技能,只能在本类中进行扩展

子类中独有方法如何实现

实现了子类中独有方法,那子类有独有的属性呢?我养了一个小泰迪,我给他起个名字,但是鸟就没有这个属性

class Animal():
    def __init__(self,kind):
        self.kind = kind
    def eat(self):
        print(‘eat...‘)
    def drink(self):
        print(‘drink...‘)

class Dog(Animal):
    def __init__(self,kind,name):
        # Animal.__init__(self,kind)  #为继承的父类中的属性初始化赋值
        super().__init__(kind)  #用super找到父类   跟上句话的效果相同
        self.name = name    #为本类独有的属性进行初始化赋值,派生属性
    def swimming(self):
        print(‘dog swimming‘)

class Bird(Animal):
    def fly(self):
        print(‘bird flying‘)
    def eat(self):
        print(‘bird eat‘)

b1 = Bird(‘麻雀‘)
b2 = Dog(‘tiddy‘,‘judy‘)
print(b1.kind)
print(b2.name)

子类中独有属性如何实现

多继承

一个类有多个父类

class A():
    def fun(self):
        print(‘aaa‘)
class B():
    def fun(self):
        print(‘bbb‘)
class C():
    def fun(self):
        print(‘ccc‘)
class D(A,B,C):     #继承A,B,C
    pass
d = D()
d.fun()     #aaa--->调用A类中的fun方法,按照继承顺序A

简单多继承

钻石继承

‘‘‘    AB       C

D       E    FF继承DE,D继承B,E继承C,BC继承A顺序是:F->D->B->E->C->A‘‘‘

# 另一个问题,关于super,super真的是找父类吗?
# class A():
#     def fun(self):
#         print(‘a‘)
# class B(A):
#     def fun(self):
#         super().fun()   #-->找C
#         print(‘b‘)
# class C(A):
#     def fun(self):
#         super().fun()   #-->找A
#         print(‘c‘)
# class D(B,C):     #继承B,C
#     def fun(self):
#         super().fun()   #-->找B
#         print(‘d‘)
# d = D()
# d.fun()     #打印结果是  a c b d
# #以菱形多继承为例,发现是根据优先算法找到的上一级

super问题

接口类和抽象类

python中其实是没有接口的概念的,接口类和抽象类是java中的概念,目的是制定一个规范

接口类和抽象类都不能被实例化

# 接口类
#     支持多继承,接口类中的所有方法都不能实现
# 抽象类
#     不支持多继承,抽象类中的方法可以被实现

接口类

from abc import abstractmethod,ABCMeta
#创建一个规范类
class Payment(metaclass=ABCMeta):#指定元类
    @abstractmethod
    def pay(self):pass  #继承该类的类必须实现本方法

接口类的多继承

思考:

如何在代码尽不重复的情况下,定义三个类:1.鸟-->会飞,会走 2.狗-->会游泳,会走 3.鸭子-->会游泳,会飞,会走

from abc import abstractmethod,ABCMeta
class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass
class Walk_Animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
class Bird(Fly_Animal,Walk_Animal):pass
class Dog(Walk_Animal,Swim_Animal):pass
class Duck(Walk_Animal,Swim_Animal,Fly_Animal):pass
b = Bird()  #  报错  TypeError: Can‘t instantiate abstract class Bird with abstract methods fly, walk
# 继承规范接口类的类必须实现加@abstractmethod 装饰器的方法,否则报错

接口类的多继承

抽象类

规定只使用单继承

实现一个抽象类

import abc
#创建一个规范类
class Payment(metaclass=abc.ABCMeta):#指定元类
    @abc.abstractmethod
    def pay(self):pass  #继承该类的类必须实现本方法

多态

python天生支持多态

鸭子类型

原文地址:https://www.cnblogs.com/jiangchengcheng/p/9606099.html

时间: 2024-11-10 13:08:41

python中的继承和多态的相关文章

python类的继承和多态

python类的继承和多态 现在属于是老年人的脑子,东西写着写着就忘了,东西记着记着就不知道了.之前学C++的时候就把类.对象这块弄得乱七八糟,现在是因为很想玩python,所以就看看python的类和对象. 就像说的,类有三个特征:封装.继承.多态. 1.封装:类封装了一些方法,可通过一定的规则约定方法进行访问权限. C++中的成员变量有public.private.ptotected. 在python中,默认的成员变量都是public的,如果成员变量前面是加两个下划线,表示该成员变量是私有的

C中的继承和多态

1.引言 继承和多态是面向对象语言最强大的功能.有了继承和多态,我们可以完成代码重用.在C中有许多技巧可以实现多态.本文的目的就是演示一种简单和容易的技术,在C中应用继承和多态.通过创建一个VTable(virtual table)和在基类和派生类对象之间提供正确的访问,我们能在C中实现继承和多态.VTable能通过维护一张函数表指针表来实现.为了提供基类和派生类对象之间的访问,我们可以在基类中维护派生类的引用和在派生类中维护基类的引用. 2.说明 在C中实现继承和多态之前,我们应该知道类(Cl

Objective-C中的继承和多态

面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多继承,为什么OC不支持多继承稍后将会提到.  说到继承呢,想到了一本书上是引用<大话西游>里的一句话来描述继承的.“人是人他妈生的,妖是妖他妈生的!”,想必里面的唐三藏也学过OOP编程,也许他们师徒四人去西天取什么算法导论呢,漫谈OOP编程啦,数据结构啦等这类的书去啦.人和妖都属于动物类,但各自有

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

python大法好——继承、多态

1.继承 类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 通过继承创建的新类称为子类或派生类,被继承的类称为基类.父类或超类. 继承语法 class 派生类名(基类名) 在python中继承中的一些特点: 1.如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法.详细说明可查看:python 子类继承父类构造函数说明. 2.在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量.区别在于类中调用

python中的继承原则

 继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子进程继承了父进程的所有公有实例变量和方法.继承实现了代码的重用.重用已经存在的数据和行为,减少代码的重新编写,python在类名后用一对圆括号表示继承关系, 括号中的类表示父类,如果父类定义了__init__方法,则子类必须显示地调用父类的__init__方法,如果子类需要扩展父类的行为,可以添加__init__方法的参数. 下面演示继承的实现 class Fruit: def __init__(self, color):

python入门18 继承和多态

继承:子类继承父类的属性和方法  class 子类名(父类1,父类2) 多态:子类重写父类的方法 判断对象是否是某个类的实例:  isinstance(object,class) 父类-汽车类 #coding:utf-8 #/usr/bin/python """ 2018-11-18 dinghanhua 继承 多态 """ '''定义一个父类-汽车类 无参构造函数,私有属性speed,方法start,speedup(每次速度+10),speed

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... 当子类

python3中的继承和多态

*继承 当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): print('Animal is running...') 当我们需要编写Dog和Cat类时,就可以直接从Animal类继承: