Python是最受欢迎的编程语言之一,因为它的多功能性和用户友好的语法。像其他适应面向对象编程(OOP)的语言一样,Python是多态的。这意味着Python中的一个运算符、函数或类方法可以有多种用途。这些不同的用途可能是学习的挑战,但它们最终使Python成为一种更有效的语言。
今天,我们将讨论多态性以及它在Python中是如何工作的。
什么是多态性?
多态性是指一种事物可以有多种形式的原则。在编程的背景下,这意味着编程语言中的一个实体可以根据上下文以多种方式表现出来。这类似于像 "表达 "这样的词在一个句子中可以作为动词,在另一个句子中作为名词,在第三个句子中作为形容词。页面上的字母顺序并没有改变,但它们在每一种情况下为句子增加的意义是根本不同的。同样,在多态编程语言中,一个实体在不同的语境中可以有不同的行为。
Python中多态性的例子
多态性是Python的一个基本条件,它在多个层面上影响着语言的工作方式。今天,我们将重点讨论Python中运算符、函数和类方法的多态性。
操作符多态性
操作符多态性,或者说操作符重载,意味着一个符号可以被用来执行多种操作。其中一个最简单的例子是加法运算符+ 。Python的加法运算符对不同的数据类型有不同的作用。
例如,如果+ 对两个整数进行操作,其结果是加法的,返回两个整数之和:
int1 = 10
int2 = 15
print(int1 + int2)
# returns 25
在上面的例子中,+ 运算符将10 和15 相加,这样输出的结果是25 。
然而,如果在两个字符串上使用加法运算符,它就会将字符串连接起来。下面是一个关于+ 运算符如何作用于字符串数据类型的例子:
str1 = "10"
str2 = "15"
print(str1 + str2)
# returns 1015
在这种情况下,输出是1015 ,因为+ 运算符连接了字符串“10” 和“15” 。这是一个例子,说明一个运算符如何在不同的情况下执行不同的操作。
函数多态性
Python中的某些函数也是多态的,这意味着它们可以作用于多种数据类型和结构,产生不同类型的信息。
例如,Python的内置函数len() ,可以用来返回一个对象的长度。然而,它将根据对象的数据类型和结构来测量对象的长度。例如,如果对象是一个字符串,len() 函数将返回字符串中的字符数。如果对象是一个列表,它将返回列表中的条目数。
下面是一个例子,说明len() 函数如何作用于字符串和列表:
str1 = "animal"
print(len(str1))
# returns 6
list1 = ["giraffe","lion","bear","dog"]
print(len(list1))
# returns 4
输出分别是6 和4 ,因为len() 函数计算的是字符串中的字符数和列表中的条目数。该函数的操作方式取决于它所作用的数据的性质。
类和方法的多态性
Python 的多态性使得重新利用类和方法变得更加容易。记住,一个类就像一个蓝图,而一个对象是这个蓝图的具体实例。因此,作为类的一部分的方法将在实例化该类的对象中重复出现。同样地,如果你从一个预先存在的类中生成一个新的类,新的类将继承预先存在的类的方法。这种情况下的新类被称为 "子类",而先前存在的类被称为 "父类"。
下面是一个关于父类和从它派生出来的子类的例子。注意,父类建立了方法type ,所以子类继承了这个方法。然而,该方法在子类中被重新定义,这样,从子类中实例化的对象就会使用重新定义的方法。这被称为 "方法覆盖":
# Define parent class Animal
class Animal:
# Define method
def type(self):
print("animal")
# Define child class Dog
class Dog (Animal):
def type(self):
print("dog")
# Initialize objects
obj_bear = Animal()
obj_terrier = Dog()
obj_bear.type()
# returns animal
obj_terrier.type()
# returns dog
方法名称type ,在子类中保持不变,但它已经被重写了。从父类中实例化的对象将使用原来的方法,因为它是在父类中定义的,而从子类中实例化的方法将使用被覆盖的方法。因此,上面程序的输出分别是animal 和dog 。
类似的原则也适用于那些相互独立的类。例如,想象一下,你正在创建两个新的类:Lion 和Giraffe:
class Lion:
def diet(self):
print(“carnivore”)
class Giraffe:
def diet(self):
print(“herbivore”)
obj_lion=Lion()
obj_giraffe=Giraffe()
obj_lion.diet()
# returns carnivore
obj_giraffe.diet()
# returns herbivore
这个程序的输出结果分别是carnivore 和herbivore 。这两个类都使用方法名diet ,但它们对这些方法的定义不同。从Lion 类实例化的对象将使用该类中定义的方法。Giraffe 类可能有一个相同名称的方法,但是从Lion 类实例化的对象不会与之交互。
Python多态性教程
学习一种新的编码技能的最好方法是实际练习它。试着运行下面例子中的代码,看看多态性的作用!首先,让我们练习操作符多态性。我们将使用+ 操作符将整数2 和3 加起来,同时将字符串“2” 和“3” 连接起来:
int1 = 2
int2 = 3
print(int1+int2)
str1 = "2"
str2 = "3"
print(str1+str2)
接下来,尝试使用len() 函数来测量字符串“numbers” 和列表[“1”,“2”,“3”,“4”] 的长度:
str1="numbers"
print(len(str1))
list1=["1","2","3","4"]
print(len(list1))
类方法的多态性要复杂一些。在下面的代码块中,我们已经创建了一个父类Fish ,并定义了一个类方法type 。然后我们创建了一个名为Shark 的子类,同时重写了type 方法,这样从Shark 类实例化的对象就会使用重写的方法:
class Fish:
def type(self):
print("fish")
class Shark(Fish):
def type(self):
print("shark")
obj_goldfish=Fish()
obj_hammerhead=Shark()
obj_goldfish.type()
obj_hammerhead.type()
最后,在下面,我们创建了两个新的、独立的类:Turtle 和Frog 。当你从Turtle 类中实例化一个对象时,该对象将使用该类中定义的type 方法。从Frog 类中实例化的对象也是如此,尽管这些方法有相同的名称:
class Turtle:
def type(self):
print("turtle")
class Frog:
def type(self):
print("frog")
obj_sea_turtle=Turtle()
obj_treefrog=Frog()
obj_sea_turtle.type()
obj_treefrog.type()
总结和下一步工作
多态性是 Python 中面向对象编程的一个重要元素。多态性使Python成为一种更加通用和高效的语言。它允许你使用一个运算符或函数来执行多个任务。它还允许你重复使用方法名称,同时为不同类的独特目的重新定义它们。
学习如何利用运算符、函数和类方法的多态性可能是一种挑战,但一旦你这样做了,你将成为一个更熟练的程序员。
学习愉快!