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