zoukankan      html  css  js  c++  java
  • 什么是鸭子类型(duck typing)

    “当看到一仅仅鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这仅仅鸟就能够被称为鸭子。”

    我们并不关心对象是什么类型,究竟是不是鸭子,仅仅关心行为。

    比方在python中。有非常多file-like的东西。比方StringIO,GzipFile,socket。它们有非常多同样的方法,我们把它们当作文件使用。

    又比方list.extend()方法中,我们并不关心它的參数是不是list,仅仅要它是可迭代的,所以它的參数能够是list/tuple/dict/字符串/生成器等.

    鸭子类型在动态语言中常常使用,很灵活。使得python不想java那样专门去弄一大堆的设计模式。


    以下样例用duck typing来实现多态。

    #coding=utf-8
    class Duck:
        def quack(self):
            print "Quaaaaaack!"
    
    class Bird:
        def quack(self):
            print "bird imitate duck."
    
    class Doge:
        def quack(self):
            print "doge imitate duck."
    
    def in_the_forest(duck):
        duck.quack()
    
    duck = Duck()
    bird = Bird()
    doge = Doge()
    for x in [duck, bird, doge]:
        in_the_forest(x)
    

    再举个栗子,

    我们来hack输出流。

    import sys
    
    sys.stdout = open('stdout.log', 'a') #仅仅要是file-like,无论是什么类型
    print 'foo'
    
    sys.stdout = sys.__stdout__ #恢复
    print 'bar'
    
    这样就把输出流给写入到文件里去了。


  • 相关阅读:
    627. Swap Salary
    176. Second Highest Salary
    596. Classes More Than 5 Students
    183. Customers Who Never Order
    181. Employees Earning More Than Their Managers
    182. Duplicate Emails
    175. Combine Two Tables
    620. Not Boring Movies
    595. Big Countries
    HDU 6034 Balala Power! (贪心+坑题)
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7089677.html
Copyright © 2011-2022 走看看