鸭子类型

如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’。python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象,也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

#二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
class TxtFile:
    def read(self):
        pass

    def write(self):
        pass

class DiskFile:
    def read(self):
        pass

    def write(self):
        pass 

在Python不崇尚通过继承来约束 

比如,列表、字符串、元组都有index方法

[].index()
''.index()
().index()

查看index源码

def index(self, value, start=None, stop=None): # real signature unknown; restored from __doc__
    """
    L.index(value, [start, [stop]]) -> integer -- return first index of value.
    Raises ValueError if the value is not present.
    """
    return 0 

鸭子类型总结:

  • 不是通过具体的继承关系来约束某些类中必须有哪些方法名,是通过一种约定俗成的概念来保证在多个类中相似的功能叫相同的名字

  • len():函数能接收的数据类型有str、list、tuple、set、dict、range(3),这些就是鸭子类型

class A:
    def func1(self):pass
    def func2(self): pass
    def func3(self): pass
a = A()
b = A()
print(A.func1)
print(a.func1)
print(b.func1)

'''
执行输出:
<function A.func1 at 0x00000184450715E8>
<bound method A.func1 of <__main__.A object at 0x00000184451D4508>>
<bound method A.func1 of <__main__.A object at 0x00000184451D4588>>
'''

# bound 表示绑定的意思。当类A实例化时,会将里面的方法与做类做绑定。

类方法,由于不适用对象内存空间中的属性,所以不会将对象和方法绑在一起,而是将类和方法绑在一起

class A:
    def func1(self):pass        # 对象与方法之间的绑定

    @classmethod
    def func2(self): pass       # 类与方法之间的绑定

    @classmethod
    def func3(self): pass

a = A()
b = A()

print(A.func2)
print(a.func2) # 对象能找到类. 类里面绑着方法
print(b.func2)

'''
执行输出:
<bound method A.func2 of <class '__main__.A'>>
<bound method A.func2 of <class '__main__.A'>>
<bound method A.func2 of <class '__main__.A'>>
'''

静态方法 不是绑定方法 没有和对象或者类发生任何绑定关系

class A:
    def func1(self):pass        # 对象与方法之间的绑定

    @classmethod
    def func2(self): pass       # 类与方法之间的绑定

    @staticmethod
    def func3(self): pass        # 静态方法

a = A()
b = A()

print(A.func3)
print(a.func3)
print(b.func3)

'''
执行输出:
<function A.func3 at 0x000001D7C46EFAF8>
<function A.func3 at 0x000001D7C46EFAF8>
<function A.func3 at 0x000001D7C46EFAF8>
'''

python处处皆对象

'a' 是str的对象

[1,2,3] 是list的对象

 

 

Python面向对象 | 鸭子方法的更多相关文章

  1. Python 面向对象 特殊方法(魔法方法)

    Python 的特殊方法,两边带双下划线的方法. 比如:__init__(self, ...).__del__(self) 1.__init__(self,...) : 构造方法 __init__(s ...

  2. python面向对象魔术方法补充

    一.描述符 在 面向对象 编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 per ...

  3. Python面向对象-定制方法

    Python中的class可以定义许多定制方法,可以让我们方便的生成特定的类. 我们之前介绍了__slots__.__len__(),python中还有许多这样的特殊函数: __str__ >& ...

  4. Python面向对象之方法

    普通方法要执行类里面的方法是通过对象触发的 触发的时候把自己赋值给self 类方法 vim day7-7.py #!/usr/bin/python # -*- coding:utf-8 -*- cla ...

  5. python 面向对象 析构方法

    实例化但从来没有调用他,就浪费了,就应该自动删除它 这个实例一直存在内存里 python有个垃圾自动回收机制 , 每段时间会自动刷新整个内存,把内存垃圾东西删除   析构函数: 在实例释放.销毁的时候 ...

  6. python面向对象-1方法、构造函数

    类是指:描述一种事物的定义,是个抽象的概念 实例指:该种事物的一个具体的个体,是具体的东西 打个比方: “人”是一个类.“张三”是人类的一个具体例子 在编程时也是同样的道理,你先自己定义一个“类”,当 ...

  7. [Python]python面向对象 __new__方法及单例设计

    __new__ 方法 使用 类名() 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间 __new__ 是一个 由 object 基类提供的 内置的静态方法,主 ...

  8. 用python面向对象的方法实现欧拉算法和龙格库塔算法

    #!/bin/python3 # -*-coding:utf-8 -*- import math import numpy as np #定义一个欧拉算法的类,从而实现不同步长的引用 class Eu ...

  9. python面向对象--item方法

    class Foo: def __getitem__(self, item): print("getitem") return self.__dict__[item] def __ ...

随机推荐

  1. 常用的ROS命令

    在这里记一下,以免以后忘记了. ------------------------------------------------------------------------------------ ...

  2. OpenDaylight开发hello-world项目之开发环境搭建

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  3. FFT/NTT基础题总结

    在学各种数各种反演之前把以前做的$FFT$/$NTT$的题整理一遍 还请数论$dalao$口下留情 T1快速傅立叶之二 题目中要求求出 $c_k=\sum\limits_{i=k}^{n-1}a_i* ...

  4. 物联网架构成长之路(40)-Bladex开发框架入门

    0. 前言 前一小节,讲了如何入门,这里就简单讲一下如何自定义查询和权限控制配置. 1. 配置多租户 如果要启用该表的多租户功能,需要在application.yml 这里配置. 2. 配置模糊匹配 ...

  5. Prometheus神器之监控K8s集群

    Prometheus 简介 Prometheus是SoundCloud开源的一款开源软件.它的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适.另外相比i ...

  6. windows10 启动安卓模拟器会蓝屏的解决方案

    最近突然想用win10装个安卓模拟器玩游戏,然后提示vt被占用. 查了一下,了解到在windows 10 系统上,我们会用vmware,virtual box ,hyper-v,安卓模拟器,360安全 ...

  7. Java JDK和IntelliJ IDEA 配置及安装

    序言 初学java,idea走一波先.安装完成,配置配置项. idea 软件 官方下载地址:https://www.jetbrains.com/idea/download/#section=windo ...

  8. 【MySQL】完整性约束条件与设计范式

    完整性约束条件 概念: 对表中的数据进行限定,保证数据的正确性.有效性和完整性. 分类: 主键约束:primary key 非空约束:not null 唯一约束:unique 外键约束:foreign ...

  9. 启明星MRBS会议室预约系统V30.0发布

    MRBS系统官方网址 https://www.dotnetcms.org/ 在线演示 http://demo.dotnetcms.org/mrbs 用户名admin,密码123456 Meeting ...

  10. 练手WPF(四)——贪吃蛇小游戏的简易实现(下)

    八.生成新的单节蛇身我们这里先说说游戏小原理好了,游戏运行后,通过计时器事件不断生成新的单节蛇身类SnakeNode,添加到List中的0位置,原来的蛇头变成了第二节.该节新蛇头的坐标通过蛇头前进方向 ...