文章目录
- 1 函数
- 1.1 默认参数
- 1.2 函数返回多值
- 1.3 函数return
- 1.4 定义可变参数
- 1.5 递归函数
- 2 类的继承
- 2.1 多态
- 2.2 多重继承
- 2.3 继承
- 2.4 判断类型
- 2.5 获取对象信息
1 函数
1.1 默认参数
函数的默认参数的作用是简化调用,只需把必须的参数传进去。在需要的时候,又可传入额外的参数来覆盖默认参数值。由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面。下面的代码是一个例子:
输入:
输出如下:
输入如下:
输入如下:
1.2 函数返回多值
函数可以返回多个值。
这样就可以同时获得返回值:
输出如下:
但是其实Python函数返回的仍然是单一值:
输出如下:
上述代码表明,其实函数返回的是一个tuple。返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
1.3 函数return
在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。函数体内部的语句在执行时,一旦执行到return
时,函数就执行完毕,并将结果返回。如果没有return
语句,函数执行完毕后也会返回结果,只是结果为None
。return None
可以简写为return
。
1.4 定义可变参数
想让函数接受任意个参数,可以定义一个可变参数:
可变参数的名字前有个*
号,可传入0个、1个或多个参数给可变参数:
输入如下:
输出如下:
输入如下:
输出如下:
输入如下:
输出如下:
Python会把传入的参数组装成一个tuple
传递给可变参数,因此,在函数内部,直接把变量 args
看成一个 tuple
就好了。定义可变参数的目的是为了简化调用。
1.5 递归函数
如果一个函数在内部调用自身本身,这个函数就是递归函数。递归函数的优点是定义简单,逻辑清晰。函数调用是通过栈——stack
这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧;每当函数返回,栈就会减一层栈帧。
2 类的继承
2.1 多态
类具有继承关系,子类可以看做父类的类型。如果从Person
派生出 Student
和Teacher
,并都写了一个 whoAmI()
方法:
再输入:
再输入:
在一个函数中,如果接收一个变量x
,则无论 x
是 Person
、Student
还是 Teacher
,都可以正确打印出结果:
再输入:
再输入:
输出如下:
这种行为称为多态。也就是说,方法调用将作用在x
的实际类型上。s
是Student
类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
2.2 多重继承
除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。
再输入:
再输入:
再输入:
D 同时继承自 B 和 C,也就是 D 拥有了 A、B、C 的全部功能。多重继承通过super()
调用__init__()
方法时,A 虽然被继承了两次,但__init__()
只调用一次。多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。
2.3 继承
如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承:
定义Student类时,只需要把额外的属性加上,例如score:
一定要用 super(Student, self).__init__(name, gender)
去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。函数super(Student, self)
将返回当前类继承的父类,即 Person ,然后调用__init__()
方法,注意self
参数已在super()
中传入,在__init__()
中将隐式传递,不需要写出(也不能写)。
2.4 判断类型
isinstance()
可以判断一个变量的类型。既可以用在Python内置的数据类型如str、list、dict,也可以用在自定义的类,本质上都是数据类型。假设有如下的 Person、Student 和 Teacher 的定义及继承关系如下:
再输入:
下面的代码使用isinstance()
判断p
、s
、t
的类型:
输入:
输出如下:
上述代码说明:在继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法。一个实例可以看成它本身的类型,也可以看成它父类的类型。
2.5 获取对象信息
输入如下:
输出如下:
可以用 dir()
函数获取变量的所有属性:
输出如下:
dir()
返回的属性是字符串列表。如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr()
和 setattr( )
函数了:
输出如下:
再输入:
输出如下:
输入如下:
输出如下:
下面的代码是一个例子:
对于Person类的定义:
希望除了name
和gender
外,可以提供任意额外的关键字参数,并绑定到实例,请修改Person
的 __init__()
定 义,完成该功能。
下面的代码是解析:
再输入:
输出如下: