今天是2020年2月20日,晴,6~14℃
一、继承
继承是一种创建新类的方式。新建类将获得原有类的所有属性和方法。原有的类称为父类(超类),新建的类称为子类。
Python中继承的方式如下:
'''
class ClassName(Base):
<statement>
'''
class Person(): #父类
'''Person类的属性和方法'''
class Student(Person): #子类
'''Student类特有的属性和方法'''
1、子类的 init 方法
创建子类实例时,首先需要创建出一个父类实例,为父类的属性赋值。因此父类中若不存在不需要参数的 Init 方法,则子类的 init 方法必须为父类的提供参数。
class Person(): #父类
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
class Student(Person): #子类
def __init__(self,name,age,gender):
super().__init__(name,age,gender) #初始化父类
如上,在子类的 init 方法中调用了特殊的 super 函数,获取父类,从而显式调用父类的 init 方法。此外,super 函数还可以用于调用父类的属性和方法。
2、定义子类的属性和方法
让一个类继承另一个类后,可添加子类特有的属性和方法。
class Student(Person):
def __init__(self,name,age,gender,grade,stu_id):
super().__init__(name,age,gender) #初始化父类
self.grade = grade #特有属性grade
self.stu_id = stu_id #特有属性stu_id
def print_stu_id(self): #特有方法print_stu_id
print(self.stu_id)
你可以根据所需添加任意数量的属性和方法。但注意,若一个属性和方法是父类拥有的,应加入父类中;只有当这个属性和方法只属于子类时才加入子类中。
3、重写父类方法
如果父类的方法不符合需求,就可对其进行重写。为此,可在子类中定义一个方法,与要重写的父类方法同名的。这样,在程序运行时Python就不会考虑父类的方法,而使用子类的方法。
class Person():
def print_info(self): #原有方法
print("Name: " + self.name)
print("Gender: " + self.gender)
print("Age: " + self.age)
class Student(Person):
def print_info(self): #重写
print("Studnet ID: " + self.stu_id)
print("Grade: " + self.grade)
print("Name: " + self.name)
print("Gender: " + self.gender)
print("Age: " + self.age)
person_1 = Person("Alex",18,"Male")
student_1 = Student("Alex",18,"Male",7,20200220)
print("This is a person:")
person_1.print_info()
print("This is a student:")
student_1.print_info()
'''
Output:
This is a person:
Name: Alex
Gender: Male
Age: 18
This is a student:
Studnet ID: 20200220
Grade: 7
Name: Alex
Gender: Male
Age: 18
'''
不同于C++中的重写需要函数名,参数表和返回类型均相同,Python中重写只要方法名相同。
4、以实例为属性
当一个类内的属性和方法过多时,可以将其中一部分作为另一个类提出,并将其作为大类的属性。
class Battery(): #电池类
def __init__(self,type_,size):
self.type_ = type_
self.size = size
def print_type(self):
print(self.type_)
def print_size(self):
print(self.size)
class Computer(): #电脑类
def __init__(self,battery_type,battery_size,mouse_type,keyboard_type,screen_type):
self.battery = Battery(battery_type,battery_size) #电池实例作为电脑的属性
self.mouse_type = mouse_type
self.keyboard_type = keyboard_type
self.screen_type = screen_type
二、导入类
与函数类似,类也可以存入模块中,然后在主程序中导入相应模块。
1、创建模块
在项目中新建一个名为person.py的的文件,并加入类的定义。
#person.py
class Person():
'''人类'''
def __init__(self,name,age,gender):
''' 构造器'''
self.name = name
self.age = age
self.gender = gender
def print_info(self):
'''输出人的信息'''
print("Name: " + self.name)
print("Gender: " + self.gender)
print("Age: " + str(self.age))
class Student(Person):
'''学生类'''
def __init__(self,name,age,gender,grade,stu_id):
'''构造器'''
super().__init__(name,age,gender)
self.grade = grade
self.stu_id =stu_id
def print_info(self):
'''输出学生的信息'''
print("Studnet ID: " + str(self.stu_id))
print("Grade: " + str(self.grade))
print("Name: " + self.name)
print("Gender: " + self.gender)
print("Age: " + str(self.age))
这样,一个简单的类模块就完成了。
2、导入类
跟导入函数一样,导入类也有多种方式,可以根据需要选用。
● 导入单个类
● 导入多个类
与导入函数相同,也可以使用 as 关键字为类指定别名。
● 导入所有类
以上三种方法均不需要使用句点表示法。
● 导入整个模块
import person
这种导入方法很简单,代码也易于阅读,不会与当前文件使用的任何名称发生冲突。
导入类的方式和导入函数基本一致。同样,导入类时也不推荐使用导入所有类的方法。一般来说,要么导入整个模块使用句点表示法,要么导入需要的类和函数。
● 在模块中导入模块
有时候,需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。 在这种情况下,可在前一个模块中导入必要的类。
#person.py
class Person():
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def print_info(self): #原有方法
print("Name: " + self.name)
print("Gender: " + self.gender)
print("Age: " + str(self.age))
#student.py
from person import Person
class Student(Person):
def __init__(self,name,age,gender,grade,stu_id):
super().__init__(name,age,gender)
self.grade = grade
self.stu_id =stu_id
def print_info(self): #重写
print("Studnet ID: " + str(self.stu_id))
print("Grade: " + str(self.grade))
print("Name: " + self.name)
print("Gender: " + self.gender)
print("Age: " + str(self.age))
#main.py
import student
person_1 = student.Person(...)
student_1 = student.Student(...)
在导入一个模块后,也可以使用在这个模块里导入的模块。调用的方式取决于模块中导入模块的方式和主程序中调用模块的方式。
例如:若都导入整个模块,则需要使用两次句点表示法;若都导入指定类,就不需要句点表示法。
3、Python标准库
在学习如何使用类和导入类后,可以开始使用Python自带的标准库了。Python标标准准库库 是一组模块,安装的Python都包含它。可使用标准库中的任何函数和类,为此 只需在程序开头包含一条简单的import 语句。
查询标准库:http://pymotw.com/ 或 https://docs.python.org/zh-cn/3/library/index.html
还可以从其他地方下载外部模块使用。