首页 - 通讯 - Python 入门基础知识(10)——类的创建、使用和继承

Python 入门基础知识(10)——类的创建、使用和继承

2023-10-10 03:46
在面向对象编程中,首先编写代表现实世界中的事物和情况的类,并基于这些类创建对象。当基于类创建对象时,每个对象自动具有该类的一般行为。同时,每个对象可以根据需要被赋予独特的个性,具体的信息和操作都存储在实例中。基于类创建对象称为实例化类,也可用于扩展现有类的功能,以便相似的类可以高效地共享代码 1.创建和使用类和实例 编写一个学生类,包含姓名、年龄、年级、家乡等信息,定义6个方法,每个方法只是打印相关信息。 班级学生(): def __init__(self, name,age,grade,hometown): #任何类都必须有这个方法。方法 __init__() 定义为包含 5 个形参:self、name、age、年级和家乡 """ __init__()是一个特殊的方法,当基于类创建实例时,Python会自动运行。该方法的名称中,开头和结尾都有两个下划线,这是一个约定。 __init__前后有两个短_,不是一个,而且中间没有空格。 self是指向实例本身的引用,允许实例访问类中的属性和方法。以 self 为前缀的变量可以是 提供类中的所有方法来初始化属性姓名、年龄、年级和家乡""" www.gsm-guard.net = name #以self为前缀的变量可供类中的所有方法使用。 www.gsm-guard.net = name 获取形参name中存储的值,存储到变量name中,然后将变量关联到当前创建的实例 self.age =age #可以通过实例访问的变量称为属性。姓名、年龄、年级和家乡都是Student类的属性。 self.grade =grade #属性self.grade,并将形参grade赋给self.grade self.hometown = 家乡 #属性家乡 def get_name(self): #定义一个打印学生姓名的方法(函数)"""print("学生姓名是 "+self.name.title()+'.') def get_age(self): #定义一个打印学生年龄的方法(函数)""" print("该学生的年龄是"+str(self.age)+'岁。') def get_grade(self): #定义打印学生家乡“””的方法 print("该学生的年级"+str(self.grade)) def get_hometown(self): #定义打印学生家乡“””的方法 print("学生 "+self.name.title()+" 来自 "+self.hometown.title()) def do_homework(self): #定义一个学生做作业的方法(函数)""" print(self.name.title()+" 现在正在做作业!") def play_game(self): #定义学生玩游戏""" print(self.name.title()+"正在和他的朋友玩游戏!") def get_student_info(self): #为学生定义一个方法(函数),打印学生信息""" Student_info = self.name.title()+' 年龄为 '+str(self.age)+' 岁,来自 '+self.hometown +' 和年级'+str(self.grade) 打印(学生信息) """实例化,创建两个学生""" Student_a = Student("jack",13,7,'Newyork') #创建实例student_a,相关参数在Student类中,相关参数与定义中的形参一一对应。方法 __init__() 中的 self 指的是它自己,不需要参数Student_b = Student("huawei",12,7,'wuhai') #创建实例 Student_b.类中的每个属性都必须有一个初始值,即使该值为0或者空字符串,在方法 __init__() 中是可以指定这个初始值的 print("学生是"+student_a.name.title()+'.') #直接调用实例中的参数 print("学生年龄为“+str(student_a.age)+”岁。") #.title()方法将首字母大写,str()将数字转换为字符串 print("\n") #打印一个空行,方便查看 Student_a.get_name() #实例化后,直接调用类方法 Student_www.gsm-guard.net_homework() Student_a.get_hometown() print("\n") #打印一个空行,方便查看 Student_b.get_name() Student_b.get_grade() Student_b.get_age() Student_www.gsm-guard.net_game() print("\n") #打印一个空行,方便查看 Student_a.get_student_info() Student_b.get_student_info() 阐明 : 1) 语句student_a = Student(“jack”,13,7,'Newyork') 该语句创建一个学生,名叫jack,年龄13,七年级,来自纽约。 调用Student类中的__init__()方法创建一个代表特定学生的实例student_a 2)语句print(“学生是”+student_a.name.title()+’.’)是访问实例属性。访问实例属性可以使用句点表示法,即实例名称.属性,如student_www.gsm-guard.net 3) 语句student_a.get_name()是一个调用方法。要调用方法,您可以指定实例的名称(此处为student_a)和要调用的方法,并用句点分隔它们。上面代码的最后几行都是调用方法。 4) 声明Student_a = Student(“jack”,13,7,'纽约') Student_b = Student(“华为”,12,7,'乌海') 根据需要根据类创建2个实例,并在创建过程中为两个实例的属性赋予不同的默认值。实际操作中,您可以根据需要创建任意数量的实例。例如,一个班级有 56 个学生,创建 56 个实例,但都具有相同的属性。注意,属性的值不一定相同。 运行结果如下: 这位学生是杰克。 该学生今年 13 岁。 这位学生的名字叫杰克。 杰克现在正在做作业! 学生杰克来自纽约 这位学生的名字叫华为。 该学生是7年级 该学生今年 12 岁。 华为正在和他的朋友玩游戏呢! 杰克今年 13 岁,来自纽约,七年级 华为今年12岁,来自乌海,七年级  实际运行结果(由于显示原因,实际运行代码删除了部分上述代码):    2。修改属性值 类写好之后,最重要的就是使用根类创建的实例。程序运行过程中的一个重要任务就是修改实例的属性。您可以直接修改实例的属性,也可以编写方法以特定方式修改它们。 属性的值可以通过三种不同的方式修改:直接通过实例;通过方法设置;通过方法递增(增加特定值) 1.直接通过例子进行修改 Student_a = Student(“jack”,13,7,'Newyork') 这里设置的年龄是13。 学生_a.年龄=12 学生a.年级=6 Student_a.get_student_info() 运行结果: 杰克今年 12 岁,来自纽约,六年级 2.通过方法更新和修改属性的值如果有更新属性的方法,那么可以将值传递给方法并在内部更新,而不是直接访问属性。 #类中新增一个update_info()方法,用于更新年龄、年级和家乡 def update_info(self, new_age, new_grade, new_hometown): #定义一个更新学生信息的方法(函数),可以更新3个参数 "" " self.age = 新年龄 self.等级=新等级 self.hometown = new_hometown #调用方法update_info()修改实例学生信息,并调用get_student_info()打印 Student_b.update_info(13, 8, 'hube') #通过update_info()方法修改属性的值,即对应的 Student_b.get_student_info() 运行结果: 华为今年13岁,湖北人,8年级 3、通过方法增加(或减少)属性的值 例如,可以提高学生的年龄和年级,游戏中的角色受到攻击后的生命力可以降低。 def add_age(self,ages):#定义增加属性值的方法 self.age +=ages # self.age值与形参ages的值相加,然后存入self.age """实例化,创建两个学生""" Student_a = Student("jack",13,7,'Newyork') #创建实例student_a, Student_a.get_student_info() #打印所有学生信息 打印('\n') Student_a.add_age(2) #年龄加2 Student_a.get_student_info() #打印所有学生信息 运行结果: 杰克今年 13 岁,来自纽约,七年级 Jack 15 岁,来自纽约,七年级 3、继承如果您编写的类是另一个现有类的特殊版本,请使用继承。当一个类继承另一个类时,它自动获得另一个类的所有属性和方法;原来的类称为父类,新的类称为子类。子类继承了父类的所有属性和方法,也可以定义自己的属性和方法,但父类不需要这些属性和方法。 继续上面的代码并重构: class Person(): #创建一个person类。父类必须包含在当前文件中并位于子类的前面。 def __init__(self, 姓名, 年龄, 家乡): #父类 www.gsm-guard.net = 姓名 自我年龄 = 年龄 self.hometown = 家乡 #属性家乡 def get_name(self): #定义一个打印学生姓名的方法(函数)""" print("此人的名字是 "+self.name.title()+'.') def get_age(self): #定义一个打印学生年龄的方法(函数)""" print("此人的年龄是 "+str(self.age)+' 岁。') def get_grade(self): #定义打印学生家乡“””的方法 print("此人等级"+str(self.grade)) def play_game(self): #定义人类游戏 """ print(self.name.title()+"正在和他的朋友玩游戏!") def get_hometown(self): #定义打印学生家乡“””的方法 print("这个人 "+self.name.title()+" 来自 "+self.hometown.title()) class Student(Person): #定义子类Student,括号内必须指定父类的名称 def __init__(self, name,age,hometown): #方法__init__()接受创建Person实例所需的信息super().__init__(姓名、年龄、家乡) self.grade = 7 #设置为默认值7 def do_homework(self): #定义一个学生做作业的方法(函数)""" print(self.name.title()+" 现在正在做作业!") def get_student_info(self): #为学生定义一个方法(函数),打印学生信息""" Student_info = self.name.title()+' 年龄为 '+str(self.age)+' 岁,来自 '+self.hometown +' 且年级为 '+str(self.grade) 打印(学生信息) def update_info(self,new_age,new_grade,new_hometown): #定义一个更新学生信息的方法(函数) """ self.age = 新年龄 self.等级=新等级 self.hometown = new_hometown “”“实例化,”“” new_student=学生("杰克",13,'纽约') new_student.get_student_info() #打印所有学生信息 打印(“\n”) Student_c=学生("莉莉",14,'纽约') Student_c.get_student_info() #由于成绩没有修改,所以打印出默认值7。 打印(“\n”) #修改实例student_c中的成绩 Student_c.grade=9 #修改自己的属性等级为9 Student_c.get_student_info() #打印所有学生信息(1) 语句:class Person()表示创建一个Person类。语句: def __init__(self, name,age, homework) 定义自身。除了self之外,还有三个形式参数,即姓名、年龄、家乡。下面的代码定义了Person的五个方法。 (2)语句:class Student(Person),定义子类Student,即Student将继承Person中的三个参数和五个方法。注意:父类的名称必须在括号中指定。 class Student(Person):定义子类Student,括号内必须指定父类的名称   def __init__(self, name,age,hometown): #方法__init__()接受创建Person实例所需的信息     super().__init__(name,age,hometown) super()是一个特殊的函数,可以帮助Python关联父类和子类。这行代码告诉Python调用Student的父类person的__init__()方法。     self.grade = 7 #为Student类添加父类Person中没有的新属性grade new_student=学生("杰克",13,'纽约') new_student.get_student_info() #打印所有学生信息 打印(“\n”) Student_c=学生("莉莉",14,'纽约') Student_c.get_student_info() #由于成绩没有修改,所以打印出默认值7。 打印(“\n”) #修改实例student_c中的成绩 Student_c.grade=9 #修改自己的属性等级为9 Student_c.get_student_info() #打印所有学生信息 运行结果: 杰克今年 13 岁,来自纽约,七年级 Lily 14 岁,来自纽约,7 年级 #grade 默认值为 7Lily 14 岁,来自纽约,9 年级 #grade 修改为 9 实际运行结果如下: ​