打字系统:动态打字、静态打字和鸭式打字
在动态类型中,类型检查是在运行时执行的。例如, 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”传递一个对象。