IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python 接口 、继承、重载运算符 -> 正文阅读

[Python知识库]python 接口 、继承、重载运算符

learn from 《流畅的python》

1. 序列__getitem__

如果没有 __iter____contains__ 方法,
Python 会调用 __getitem__ 方法,
设法让 迭代 和 in 运算符可用

class Foo:
    def __getitem__(self, pos):
        return range(0, 30, 10)[pos]


f = Foo()
print(f[1])  # 10
for i in f:
    print(i)  # 0, 10, 20
# 如果没有 __iter__ 和 __contains__ 方法,
# Python 会调用 __getitem__ 方法,
# 设法让迭代和 in 运算符可用

2. __setitem__

import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])


class FrenchDeck:
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]
	
	def __str__(self):
        return ",".join(str(i) for i in self._cards)

from random import shuffle

deck = FrenchDeck()
print(str(deck))
# Card(rank='2', suit='spades'),Card(rank='3', suit='spades'),Card(rank='4', suit='spades'),Card(rank='5', suit='spades'),Card(rank='6', suit='spades'),Card(rank='7', suit='spades'),Card(rank='8', suit='spades'),Card(rank='9', suit='spades'),Card(rank='10', suit='spades'),Card(rank='J', suit='spades'),Card(rank='Q', suit='spades'),Card(rank='K', suit='spades'),Card(rank='A', suit='spades'),Card(rank='2', suit='diamonds'),Card(rank='3', suit='diamonds'),Card(rank='4', suit='diamonds'),Card(rank='5', suit='diamonds'),Card(rank='6', suit='diamonds'),Card(rank='7', suit='diamonds'),Card(rank='8', suit='diamonds'),Card(rank='9', suit='diamonds'),Card(rank='10', suit='diamonds'),Card(rank='J', suit='diamonds'),Card(rank='Q', suit='diamonds'),Card(rank='K', suit='diamonds'),Card(rank='A', suit='diamonds'),Card(rank='2', suit='clubs'),Card(rank='3', suit='clubs'),Card(rank='4', suit='clubs'),Card(rank='5', suit='clubs'),Card(rank='6', suit='clubs'),Card(rank='7', suit='clubs'),Card(rank='8', suit='clubs'),Card(rank='9', suit='clubs'),Card(rank='10', suit='clubs'),Card(rank='J', suit='clubs'),Card(rank='Q', suit='clubs'),Card(rank='K', suit='clubs'),Card(rank='A', suit='clubs'),Card(rank='2', suit='hearts'),Card(rank='3', suit='hearts'),Card(rank='4', suit='hearts'),Card(rank='5', suit='hearts'),Card(rank='6', suit='hearts'),Card(rank='7', suit='hearts'),Card(rank='8', suit='hearts'),Card(rank='9', suit='hearts'),Card(rank='10', suit='hearts'),Card(rank='J', suit='hearts'),Card(rank='Q', suit='hearts'),Card(rank='K', suit='hearts'),Card(rank='A', suit='hearts')
shuffle(deck)  # TypeError: 'FrenchDeck' object does not support item assignment
  • 加入__setitem__
    def __setitem__(self, key, value):
        self._cards[key] = value
shuffle(deck) 
print(str(deck))
# 牌被随机打乱了
# Card(rank='6', suit='hearts'),Card(rank='2', suit='spades'),Card(rank='3', suit='hearts'),Card(rank='A', suit='clubs'),Card(rank='7', suit='clubs'),Card(rank='Q', suit='diamonds'),Card(rank='5', suit='hearts'),Card(rank='6', suit='spades'),Card(rank='5', suit='diamonds'),Card(rank='8', suit='diamonds'),Card(rank='K', suit='hearts'),Card(rank='Q', suit='hearts'),Card(rank='8', suit='hearts'),Card(rank='3', suit='diamonds'),Card(rank='Q', suit='clubs'),Card(rank='A', suit='diamonds'),Card(rank='9', suit='hearts'),Card(rank='7', suit='diamonds'),Card(rank='A', suit='spades'),Card(rank='J', suit='hearts'),Card(rank='3', suit='clubs'),Card(rank='4', suit='hearts'),Card(rank='Q', suit='spades'),Card(rank='10', suit='diamonds'),Card(rank='10', suit='hearts'),Card(rank='K', suit='diamonds'),Card(rank='2', suit='diamonds'),Card(rank='4', suit='spades'),Card(rank='3', suit='spades'),Card(rank='7', suit='hearts'),Card(rank='9', suit='clubs'),Card(rank='J', suit='clubs'),Card(rank='J', suit='diamonds'),Card(rank='10', suit='spades'),Card(rank='4', suit='diamonds'),Card(rank='7', suit='spades'),Card(rank='9', suit='diamonds'),Card(rank='2', suit='hearts'),Card(rank='6', suit='clubs'),Card(rank='K', suit='clubs'),Card(rank='4', suit='clubs'),Card(rank='A', suit='hearts'),Card(rank='K', suit='spades'),Card(rank='2', suit='clubs'),Card(rank='J', suit='spades'),Card(rank='8', suit='spades'),Card(rank='5', suit='spades'),Card(rank='9', suit='spades'),Card(rank='10', suit='clubs'),Card(rank='8', suit='clubs'),Card(rank='6', suit='diamonds'),Card(rank='5', suit='clubs')

或者 在类外打补丁 FrenchDeck.__setitem__ = 函数

def set_card(deck, position, card):
    deck._cards[position] = card


FrenchDeck.__setitem__ = set_card

3. 抽象基类

class Test:
    def __len__(self):
        return 24


from collections import abc

print(isinstance(Test(), abc.Sized)) # True

只要实现了 __len__() 方法,就可以被 abc.Sized 识别为子类

4. 不要直接子类化内置类型

class AnswerDict(dict):
    def __getitem__(self, key):
        return 24


ad = AnswerDict(a="good")
print(ad['a'])  # 24
d = {}
d.update(ad)
print(d['a'])  # good
print(ad)  # {'a': 'good'}
print(d)  # {'a': 'good'}

直接子类化内置类型(如 dict、liststr)容易出错, 因为 内置类型的方法 通常会 忽略用户覆盖的方法
不要子类化内置 类型,用户自己定义的类 应该继承 collections 模块 中的类,例如 UserDict、UserListUserString,这些类做了特殊设计,因 此易于扩展

import collections


class AnswerDict2(collections.UserDict):
    def __getitem__(self, key):
        return 24
ad = AnswerDict2(a="good")
print(ad['a'])  # 24
d = {}
d.update(ad)
print(d['a'])  # 24
print(ad)  # {'a': 'good'}
print(d)  # {'a': 24}

5. 继承顺序

  • 多重继承的同名方法调用,根据类的 __mro__ 属性顺次在类中查找
  • 推荐使用 super() 函数

6. 重载运算符


在这里插入图片描述
不可变类型,,一定不能实现就地特殊方法
__iadd__等增量赋值特殊方法 必须返回 self

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:03:18  更:2021-08-20 15:03:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:30:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码