鸭子类型
如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’。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) ''' 执行输出:''' # 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) ''' 执行输出:> '''> >
静态方法 不是绑定方法 没有和对象或者类发生任何绑定关系
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) ''' 执行输出:'''
python处处皆对象
'a' 是str的对象
[1,2,3] 是list的对象