python高级编程技巧第一节-深入类和对象

鸭子类型与多态

  • 动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的‘鸭子类型’,它并不要求严格的继承体系,一个对象只要‘看起来像鸭子,走起路来像鸭子’,那它就可以被看作是鸭子。
a = [1, 2]
b = [3, 4]
c = (5, 6)
d = {7, 8}
e = {'a': 9}

# iterable 可迭代对象 就是可以用for去循环的对象
a.extend(b)
print(a)  # [1, 2, 3, 4]
a.extend(c)
print(a)  # [1, 2, 3, 4, 5, 6]
a.extend(d)
print(a)  # [1, 2, 3, 4, 5, 6, 8, 7]
a.extend(e)
print(a)  # [1, 2, 3, 4, 5, 6, 8, 7, 'a']
  • 定义时的类型和运行时的类型不一样,就称为多态。
class Cat(object):
    def say(self):
        print('I am a cat')


class Dog(object):
    def say(self):
        print('I am a dog')


class Duck(object):
    def say(self):
        print('I am a Duck')


animal_list = [Cat, Dog, Duck]
for animal in animal_list:
    animal().say()  # 不知道调用的是哪个方法

抽象基类(abc模块)

  • 抽象基类介绍
    • 抽象基类(abstract base class,ABC): 抽象基类就是类里定义了纯虚成员函数的类。
    • 纯虚函数只提供了接口,并没有具体实现。
    • 抽象基类不能被实例化(不能创建对象),通常是作为基类提供子类继承,子类中重写虚函数,实现具体的接口。
    • 抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。
  • 抽象基类应用场景
    • 我们去检查某个类中是否有某种方法
    • 我们需要强调某个子类必须实现某些方法
import abc
from abc import ABC


class CatheBase(ABC):
    @abc.abstractmethod
    def get(self, key):
        raise ValueError  # 主动抛出异常

    @abc.abstractmethod
    def set(self, key, value):
        pass


class RedisCathe(CatheBase):
    def get(self, key):
        pass

    def set(self, key, value):  # 少写一个方法就会抛出异常TypeError: Can't instantiate abstract class RedisCathe with abstract method set
        pass


r = RedisCathe()

type&isinstance&类属性和实例属性

多继承查询顺序&自省机制

super函数&Mixin模式

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yerennuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值