Python面向对象 | 鸭子方法

鸭子类型

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

 

 

猜你喜欢

转载自www.cnblogs.com/Summer-skr--blog/p/11801447.html
今日推荐