Python学习笔记之类(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012561176/article/details/81984185

1、什么是继承:编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类, 而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。 

2、子类的方法__init__() ,创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值,为此,子类的方法__init__()需要父类对相关的属性赋值。示例代码如下:

#子类的方法__init__() 

class Person():
    """一个人类,作为父类"""
    def __init__(self,name,age,sex):
        """父类初始化方法"""
        self.name = name;
        self.age = age;
        self.sex = sex;

    def get_desc_info(self):
        print("姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex);
		
class Student(Person):
    """一个学生类,作为子类"""
    def __init__(self,name,age,sex):
        """子类初始化方法"""
        super().__init__(name,age,sex);
		
student = Student('林梓然',26,'男');
student.get_desc_info();

代码解析(1)-(4):

(1)、创建子类时,父类必须包含在当前文件中,且位于子类前面。 如上面父类Person必须在Student子类前面。

(2)、定义子类时,必须在括号内指定父类的名称。如上面的class Student(Person):

(3)、子类方法__init__() 接受创建Person实例所需的信息。super().__init__(name,age,sex); 这行代码中,super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用 Person的父类的方法__init__(),让Student实例包含父类的所有属性。父类也称为超类(superclass)。注意,这里面千万要写成super(),写成super的话将会报错,详细可以看这篇文章:https://blog.csdn.net/u012561176/article/details/81984946

(4)、接着创建子类Student的实例,就会调用子类的__init__()方法,再调用父类的__init__()方法,分别存储起来到父类的各个属性中,然后调用get_desc_info()方法便打印出子类实例传递过去的实参值。

运行后如下图所示:

3、给子类定义属性和方法,让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。 示例代码如下:

#给子类定义属性和方法 

class Person():
    """一个人类,作为父类"""
    def __init__(self,name,age,sex):
        """父类初始化方法"""
        self.name = name;
        self.age = age;
        self.sex = sex;

    def get_desc_info(self):
        print("姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex);
		
class Student(Person):
    """一个学生类,作为子类"""
    def __init__(self,name,age,sex):
        """子类初始化方法"""
        super().__init__(name,age,sex);
        self.major = '软件工程'
        self.number = '2012131739';
    
    def get_student_info(self):
        print("该学生的姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex + ",专业为:" + self.major + ",学号为:"+ self.number);
		
student = Student('林梓然',26,'男');
student.get_student_info();

代码解析:其中在子类的__init__()方法中增加了两个属性major和number,并赋给了默认值,子类又定义添加了一个get_student_info()方法,输出打印学生的信息,后面获取子类的实例,调用实例的方法,运行后如下图所示:

4、重写父类的方法,对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方 法,而只关注你在子类中定义的相应方法。改下上面的代码看:

#给子类定义属性和方法 

class Person():
    """一个人类,作为父类"""
    def __init__(self,name,age,sex):
        """父类初始化方法"""
        self.name = name;
        self.age = age;
        self.sex = sex;

    def get_desc_info(self):
        print("姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex);
		
class Student(Person):
    """一个学生类,作为子类"""
    def __init__(self,name,age,sex):
        """子类初始化方法"""
        super().__init__(name,age,sex);
        self.major = '软件工程'
        self.number = '2012131739';
    
    def get_desc_info(self):
        print("该学生的姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex + ",专业为:" + self.major + ",学号为:"+ self.number);
		
student = Student('林梓然',26,'男');
student.get_desc_info();

 运行后如下图所示:

5、将实例用作属性 ,使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型类拆分成多个协同工作的小类。实例代码如下:

#将实例用作属性

class Person():
    """一个人类,作为父类"""
    def __init__(self,name,age,sex):
        """父类初始化方法"""
        self.name = name;
        self.age = age;
        self.sex = sex;

    def get_desc_info(self):
        print("姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex);
		
class Course():
    """一个课程类,作为学生来学习课程"""
    def __init__(self,name,course_name='计算机导论'):
        self.name = name;
        self.course_name = course_name;
    def stu_course(self):
        print(self.name + "正在学习课程:" + self.course_name);
		
class Student(Person):
    """一个学生类,作为子类"""
    def __init__(self,name,age,sex):
        """子类初始化方法"""
        super().__init__(name,age,sex);
        self.major = '软件工程'
        self.number = '2012131739';
        self.course = Course(name);
    
    def get_stu_info(self):
        print("该学生的姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex + ",专业为:" + self.major + ",学号为:"+ self.number);
		
student = Student('林梓然',26,'男');
student.course.stu_course();

代码解析(1)-(3):

(1)、其中增加了一个Course课程类,里面__init__()方法里有三个形参,分别为name和course_name(这个有默认值),然后分别存储到对应的变量中,里面增加了个方法stu_course(),打印一条信息。

(2)、在学生类子类__init__()方法中定义多了一个属性为course课程,接着用Course类的Course(name)赋给course这个属性。

(3)、接着获取Student子类的实例student,获取student.course属性,这样就获取到Course类的实例,再调用实例的stu_course()方法。

运行后如下图所示:

以上内容仅供大家学习参考,谢谢!

猜你喜欢

转载自blog.csdn.net/u012561176/article/details/81984185