python鸭子类型_你知道什么是Python里的鸭子类型和猴子补丁吗?

article/2025/11/10 20:02:56

有时候我们会听到Python里所谓的鸭子类型和猴子补丁的说法,乍一听还以为是来到了动物园,Python这只大蟒蛇还可以和鸭子和猴子一起玩耍?

1a1cee2754e0adee6c24512d9f8f198a.png

1a1cee2754e0adee6c24512d9f8f198a.png

1a1cee2754e0adee6c24512d9f8f198a.png

非也非也,鸭子类型和猴子补丁实际上是两个生动有趣的比喻,用来说明Python的动态特性。

鸭子类型🦆(duck type) 是对Python中数据类型本质上是由属性和行为来定义的一种解读。

猴子补丁🐒(monkey patching)是对Python中类和模块可以在外部被动态修改这种特性的一个比喻。

让我们来一探究竟吧!

一,鸭子类型

鸭子类型是对Python中数据类型本质上是由属性和行为来定义的一种解读。

Python是一种动态语言,不像Java和C++这种强类型语言,Python里实际上没有严格的类型检查。

只要某个对象具有鸭子的方法,可以像鸭子那样走路和嘎嘎叫,那么它就可以被其它函数当做鸭子一样调用。

# 这是一个鸭子(Duck)类

class Duck:

def __init__(self,name):

self.name = name

def swim(self):

print("A duck named " + self.name+" is swimming...")

def call(self):

print("gay...gay...gay...")

# 这是一个鹅(Goose)类

class Goose:

def __init__(self,name):

self.name = name

def swim(self):

print("A goose named " + self.name+" is swimming...")

def call(self):

print("goo...goo...goo...")

# duckshow这个函数设计的本意是需要传入一个Duck对象作为参数的。

def duckshow(duck):

duck.swim()

duck.call()

yaya = Duck("yaya")

ee = Goose("ee")

# 但由于Python是动态语言,其数据类型属于鸭子类型,没有严格类型检查,

# Goose这个类具有和Duck这个类相同的方法,

# ee这只鹅划起水来像只鸭子,叫起来也像一只鸭子,

# 所以duckshow这个函数也可以对ee进行作用。

duckshow(yaya)

duckshow(ee)

输出结果如下:

A duck named yaya is swimming...gay ... gay ... gay ...A goose named ee is swimming...goo ... goo ... goo ...

二,猴子补丁

猴子补丁是对Python中模块和类可以在外部被动态修改这种特性的一个比喻。

为什么叫做猴子补丁呢?在模块和类的外部对模块和类进行修改是一种非常耍赖的做法,会破坏代码的封装结构,这种事情大概只有淘气的猴子喜欢去做,因此形象地称之为猴子补丁。

# 定义一个Dog类

class Dog:

def __init__(self,name,age):

self.name = name

self.age = age

def sleep(self):

print("Zzz...Zzz..Zzz...")

# 在类的外部给Dog这个类添加猴子补丁

def speak(self):

print("I think myself a hero and very handsome!")

Dog.speak = speak

Dog.home = "Earth"

# 与类的内部定义的属性和方法无差异

snoopy = Dog("snoopy",3)

snoopy.sleep()

snoopy.speak()

print(snoopy.home)

输出结果如下:

Zzz ... Zzz ... Zzz ...I think myself a hero and very handsome!Earth

对于库中已经定义好的类,给它们添加猴子补丁有时候会非常方便,相当于可以自由地在外面做扩展,又不用修改源文件。

import numpy as np

import pandas as pd

df = pd.DataFrame(np.random.randint(1,10,size=(5,5)),

columns = list("abcde"))

#df.info()

#DataFrame自带方法info打印信息太多,展示不直观。

#给DataFrame定义一个猴子补丁方法memory简洁展示其内存消耗。

def memory(self):

mem = self.__sizeof__()

if mem<1024:

return("%s B"%mem)

elif mem<1024*1024:

return("%s KB"%mem/1024)

elif mem<1024**3:

return("%s MB"%mem/1024**2)

else:

return("%s GB"%mem/1024**3)

pd.DataFrame.memory = memory

print(df.memory())

输出结果如下:

280 B

这就是Python里的鸭子类型和猴子补丁的一个简单介绍,你耍明白了吗?🐒🐒🐒🦆🦆🦆


http://chatgpt.dhexx.cn/article/E8KGVnLT.shtml

相关文章

java鸭子类型_Golang中的接口与鸭子类型

1 接口的定义与理解 接口是一个自定义类型&#xff0c;它是一组方法的集合。从定义上来看&#xff0c;接口有两个特点。第一&#xff0c;接口本质是一种自定义类型&#xff0c;因此不要将golang中的接口简单理解为C/Java中的接口&#xff0c;后者仅用于声明方法签名。第二&…

编程语言中的 DUCK TYPING|python、c++、java、go

如果一只动物走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子&#xff0c;那么这只动物就可以被称为鸭子。 许多编程语言都支持 Duck Typing &#xff0c;通常 Duck Typing 是动态编程语言用来实现多态的一种方式。 在理解 Duck Typing 前&#xff0c;先看一张图片&#xff0c;…

Windows中采用命令行方式启动服务

1. 服务名不一定是你在服务面板看到的那个名&#xff0c;例如&#xff0c;你要打开被禁用的telnet服务&#xff0c;sc config telnet start auto,报错&#xff1a;[SC] OpenService FAILED 1060&#xff0c;因为telnet的服务名不是telnet而是tlntsvr, sc config tlntsvr start …

CentOS开启服务命令详解

一、学前须知 讲服务管理之前先了解下Linux的启动流程非常有必要&#xff0c;直观的先上CentOS的启动图&#xff1a; Centos7 Centos6的也补充下&#xff1a; 图片信息量较大&#xff0c;网友可根据自己的知识水平逐一按上图去填充自己&#xff0c;也欢迎指正&#xff1b;本节…

启动consul服务命令

启动Consul 安装配置好Consul以后&#xff0c;我们可以通过简单的命令启动consul。先来看最简单的启动方式&#xff1a; consul agent -dev 在新终端中&#xff0c;执行如上操作。 hongweiyulocalhost:~$ consul agent -dev > Starting Consul agent... > Consul agen…

Windows 服务快捷启动命令

Windows 服务快捷启动命令 gpedit.msc&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;组策略sndrec32&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;录音机nslookup&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d; ip地址侦测器…

Linux 系统启动与服务管理

文章目录 1. 前言2. Linux 系统启动过程2.1 开机自检2.2 MBR 引导2.3 GRUB 菜单2.4 加载 Linux 内核2.5 init 进程初始化2.6 系统启动过程总结 3. init 进程与 systemd3.1 init 进程3.2 Centos5/6/7 init 进程对比3.3 systemd3.4 systemd 单元类型3.5 运行级别对应的 systemd 目…

linux启动服务

查看开机启动项 1&#xff1a;systemctl list-unit-files --typeservice 2&#xff1a;systemctl list-unit-files --typeservice | grep enabled 3&#xff1a;systemctl list-unit-files --typeservice | grep disabled 开机停止某个服务&#xff1a; 1&#xff1a;sudo …

Linux常用启动服务命令

一、Nginx 1、启动 [root172 udm-web]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf2、重新加载配置文件 [root172 udm-web]# /usr/local/nginx/sbin/nginx -s reload二、防火墙 1、查看状态 systemctl status firewalld2、关闭防火墙 systemc…

Windows 启动服务命令大全

描述&#xff1a; 在日常工作学习中&#xff0c;可能会常用到windows系统自带的计算器、记事本、画图等小工具&#xff0c;本文将介绍如何使用命令快速打开这些小工具。 1、快速启动画图工具 在以下三个地方输入画图工具命令&#xff1a;mspaint &#xff0c;然后按“Enter”或…

Ubuntu常用终端命令

Ubuntu常用终端命令 1.显示任务管理器&#xff1a; ps aux 2.kill进程&#xff1a; kill PID号 3.后台运行程序&#xff1a; nohup python3 xxxx.py & 4.查看文件列表 ls 5.进入文件夹 cd 文件夹名 6.解压与压缩命令 6.1.tar 文件 # 打包&#xff0c;非压缩 tar…

ubuntu在终端中打开文件管理器

打开ubuntu的终端&#xff0c;输入nautilus [path] 弹出资源管理器界面

UBUNTU 18.04开机自启动脚本实现--打开终端、执行命令及终端输入文字

开机自启动 方法很多&#xff0c;测试了一下&#xff0c;在18.04中最方便的方法如下&#xff1a; 新建sh脚本 touch xxx.sh gedit xxx.h然后输入&#xff1a; #!/bin/bash## xxx.sh## 你的代码#exit 0保存后退出&#xff0c;并在终端继续执行&#xff1a; chmod ax xxx.sh通…

Ubuntu终端打开文件及查看目录

方法/步骤 1 ctrlaltt&#xff0c;调出终端。------------ 要去某个目录&#xff0c;用cd 例如&#xff1a; cd /home/yang/下载/ 在视图中&#xff0c;后面还有一个文件夹&#xff0c;我记不住&#xff0c;就按tab键一下。就自动出来了。 如果该文件夹下东西比较多&#x…

解决Ubuntu新装系统终端打不开

一、问题说明 笔者新安装的虚拟机&#xff0c;操作系统为Ubuntu18.10&#xff0c;出现终端打不开的情况&#xff1a;应用–终端打不开&#xff0c;ctrlaltt没反应&#xff0c;进入文件管理器&#xff0c;右键–在终端中打开也没反应。 二、解决方法 进入设置&#xff0c;找到…

Ubuntu 打开多个终端

Ctrl Shift T,一个终端开启多个小终端 Ctrl Alt T 开启多个独立终端 Ctrl Shift 加号&#xff0c;放大终端字体 Ctrl 减号&#xff0c;缩小终端字体

ubuntu打开linux,ubuntu怎样打开终端(方法5种)

虽然这不是一编技术经验&#xff0c;但是想起来小编刚接触ubuntu的时候也不会打开终端&#xff0c;所以今天小编就给一些玩ubuntu的新手们&#xff0c;分享一下经验。 怎样打开终端 (方法1) 1 首先在桌面任意空白处&#xff0c;按CTRLALTT 2 这时就弹出终端窗口 (呵呵这招最好用…

Ubuntu20.04 终端打开不了的问题排查

Ubuntu20.04 终端打开不了的问题排查 今天用virtualbox安装了ubuntu20.04 问题&#xff1a;右键打开终端&#xff0c;怎么也打开不了&#xff01; 点了也没反应&#xff0c;或者鼠标转小圈圈&#xff0c;然后也没有反应… 解决方法&#xff1a; 1、Ctrl Alt F6 先切换到终…

ubuntu开机自动打开终端输入命令且执行命令

打开终端 输入 gedit ~/.bashrc打开 .bashrc文件 之后把要执行的命令写入文件末尾 保存退出 source ~/.bashrc更新文件 此时&#xff0c;打开终端后&#xff0c;就会自动执行命令 如果有sudo命令需要运行&#xff0c;则使用echo 输入密码。 比如&#xff1a;echo “passwor…

【Linux】ubuntu 20无法打开终端的解决方法

前因&#xff1a; 我在开发板Firefly上&#xff0c;用的是ubuntu操作系统&#xff0c;因其本身默认是英文输入法&#xff0c;没有中文输入法。所以&#xff0c;我安装了中文输入法&#xff0c;结果安装好了后&#xff0c;发现终端已经打不开了。。。。。。 无论是右键、单击程…