📜  打字系统:动态打字、静态打字和鸭式打字

📅  最后修改于: 2022-05-13 01:55:29.885000             🧑  作者: Mango

打字系统:动态打字、静态打字和鸭式打字

动态打字:

在动态类型中,类型检查是在运行时执行的。例如, Python是一种动态类型语言。这意味着允许变量的类型在其生命周期内改变。其他动态类型语言有 -Perl、Ruby、 PHP、Javascript 等。
让我们以Python代码示例来看看变量是否可以更改类型:

## variable a is assigned to a string
a ="hello"
print(type(a))
  
## variable a is assigned to an integer
a = 5
print(type(a))

这证实了变量“a”的类型是允许改变的,并且Python在它改变时正确地推断出类型。

让我们再举一个Python中动态类型的例子:

## simple function
def add(a, b):
    return a + b
  
## calling the function with string
print(add('hello', 'world'))
  
## calling the function with integer
print(add(2, 4))

在Python中,我们真的不知道这个函数处理什么类型以及返回值的类型是什么。

静态类型:

静态类型与动态类型相反。在静态类型中,类型检查是在编译时执行的。这意味着变量的类型在编译时是已知的。对于某些语言,程序员必须指定每个变量的类型(例如 C、C++、 Java),而其他语言提供某种形式的类型推断(例如 Scala、Haskell)。
使用静态类型,通常不允许变量更改类型。
让我们看一个来自静态类型语言的简单示例。考虑以下Java代码段;

String a;
a = "Java is good";

第一行声明变量“a”在编译时绑定到字符串类型。在第二行中,“a”被分配了一个不是字符串对象的值。例如,如果我们说 a =5,编译器会因为类型不兼容而引发错误。

鸭打字

Duck Typing 是一个与 Dynamic Typing 相关的概念,其中对象的类型或类不如它定义的方法重要。使用 Duck Typing,我们根本不检查类型。相反,我们检查给定方法或属性的存在。
名字背后的原因是鸭子测试:“如果它看起来像鸭子,像鸭子一样游泳,像鸭子一样嘎嘎,那么它可能是一只鸭子”。
让我们通过一个简单的Python代码示例来清楚地理解它:

class Duck:
    def quack(self):
        print("Quack")
  
class Goose:
    def quack(self):
        print("Quack Quack")
  
class Dog:
    def bark(self):
        print("I just bark")
  
class ItQuacks:
    def __init__(self, animal):
        animal.quack()
  
ItQuacks(Duck())
ItQuacks(Goose())
ItQuacks(Dog())

实现了“quack”方法的类将能够调用(Duck、Goose 对象),但是对于不提供“quack”方法实现的“Dog”类,如果我们尝试调用,则会得到“AttributeError”传递一个对象。