鸭子类型

如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’。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的对象

 

 

最新文章

  1. Leetcode Search for a Range
  2. ios 在中国地区,24小时时间格式 系统设定下 获得12小时制时间的方法
  3. SVM+HOG特征训练分类器
  4. web前端开发(3)
  5. PDF.NET框架操作——工具应用(一)
  6. connect to a specific wifi network in Android programmatically
  7. Python设计模式——装饰模式(Decorator)
  8. ActiveMQ的安全机制使用及其源代码分析 [转]
  9. CodeForces 146E - Lucky Subsequence DP+扩展欧几里德求逆元
  10. HibernateTemplate常用方法总结
  11. 全面解读Python Web开发框架Django
  12. 关于C#开发 windows服务进程
  13. QQ的成功,远没有你想象的那么顺利和轻松
  14. linux操作命令 开发人员需要掌握的一些命令
  15. swift函数的调用约定
  16. 【PHP】xampp配置多个监听端口和不同的网站目录(转)
  17. JavaScript与CSS相对路径引用的差异
  18. 《剑指offer》第一题(重载赋值运算符)
  19. 给easyui datebox扩展一个清空按钮
  20. 面试题41:和为s的两个数字 || 和为s的连续正数序列

热门文章

  1. python进阶之命名空间与作用域
  2. Spring Boot(十二):LocalDateTime格式化处理
  3. Spark学习笔记01-基础
  4. 【Linux命令】ulimit设置最大文件打开数
  5. Shell基本运算符之字符串运算符
  6. Mac终端常用快捷键
  7. docker入门与部署微服务--学习笔记
  8. 关于使用IDEA,使用Maven打包项目
  9. Spring源码系列 — BeanDefinition
  10. C# iText split PDF C# 拆分PDF