java实现鸭子类型_鸭子类型和多态

鸭子类型与多态

内容鸭子类型和多态

抽象基类(abc模块)

使用isinstance和type的区别

类属性和实例属性

类属性和实例属性查找顺序

Python对象的自省机制

super函数

鸭子类型

多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型"

动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

a=[1,2,3]

b=[2,3,4]

c=(1,5,6)

a.extend(c)

print(a)

a.extend(c)

print(a)

多态

定义时的类型和运行时的类型不一样,就称为多态。

class Cat(object):

def info(self):

print("我是一只猫")

class Dog(object):

def info(self):

print("我是一只狗")

class Duck(object):

def info(self):

print("我是一只鸭")

list=[Cat,Dog,Duck] #程序在运行到这一步是只把Cat,Dog,Duck当成变量

for animal in list:

animal().info() #只有实例化调用类方法的时候才会明白是一个类,这就表示多态

抽象基类(abc模块)

抽象基类介绍

抽象基类(abstract base class,ABC):抽象基类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。

抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。

抽象基类应用场景1.我们去检查某个类中是否有某种方法

from collections.abc import Sized

class Demo(object):

def __init__(self,li):

self.li=li

def __len__(self):

return len(self.li)

list=["C","python","Java"]

d=Demo(list)

print(len(d))

print(hasattr(d,"__len__")) #判断Demo中是否含有len方法

print(isinstance(d,Sized)) #判断d是否是Sized这个类2.我们需要强调某个子类必须实现某些方法

import abc

class CacheBase(metaclass=abc.ABCMeta):

def dele(self):

pass

@abc.abstractmethod

def crea(self):

pass

class Redisbase(CacheBase):

def crea(self):

print("create")

r=Redisbase()

r.crea()

type与isinstance区别type 不考虑 继承关系

isinstance 考虑继承关系

类属性与实例属性

基本查找顺序对象是可以向上查找的,所以可以访问到类属性当对象自己有该实例属性时 ,则输出的是自己的

类不能向下查找,所以只能访问到类属性

class Cat(object):

meow=1

def __init__(self,a,b):

self.a=a

self.b=b

cat=Cat(1,2)

print(cat.meow)

print(cat.a,cat.b)

print(cat.meow)

print(Cat.a) #向下查找时就会报错

print(cat.meow)# 相当于封装

print(Cat.meow)#相当于覆盖

class Cat(object):

meow=1

def __init__(self,a,b):

self.a=a

self.b=b

self.meow="3"

c=Cat(1,2)

print(c.meow)#当对象该实例化属性的时候,就直接输出自己的

print(Cat.meow)#当对象自己没有该属性的时候才会向类向上查找

类属性与实例属性

基本查找顺序对象是可以向上查找的,所以可以访问到类属性当对象自己有该实例属性时 ,则输出的是自己的

类不能向下查找,所以只能访问到类属性

多继承查询顺序

继承关系如下,则属性查找顺序为?

实际上,python2.2(金典类)之前的算法:MRO算法,DFS(deep first search) 深度优先。

如下图,菱形继承,执行顺序如何?

在python2.2版本之后,引入BFS(广度优先)。

在python新式类,就引入了C3算法,通过className.__mro__来查看。

Python对象自省机制

自省是通过一定的机制查询到对象的内部结构

Python中比较常见的自省(introspection)机制(函数用法)有:dir(),type(), hasattr(), isinstance(),通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,访问对象的属性。

class Prepon(object):

name="白晓吧"

class Student(Prepon):

def __init__(self,school_name):

self.school_name=school_name

hty=Student("xiao")

print(hty.__dict__)#返回当前对象的属性

print(dir(hty)) #返回所有的成员,考虑继承

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值