前言
之前天天看到有人用类相关的知识但是学校老师就是没讲过,然后再读了莫烦老师的讲解后,有了一定的了解,进行一个总结。
正文
类的意义
类其实就是正如他的名字一样,是一类事物(其实叫做对象)的总称,就像学生信息,每个学生都是一个事物(对象),但是我们对每一个学生的信息都进行一个变量的输入的话,未免过于冗杂,就像下面
student1={'名字':'hh','年龄':19,'性别':'男'}
student2={'名字':'nn','年龄':20,'性别':'男'}
student3={'名字':'ww','年龄':20,'性别':'男'}
虽然看起来比较整齐,但其实录入的时候很麻烦,所以我们需要一个优雅地方式,函数
def luru(people,xm,nn,xb):
people['姓名']=xm
people['年龄']=nn
people['性别']=xb
student1=dict()
luru(student1,'hh',19,'男')
这样输入信息只需要一个简单的函数了对吧,但是如果我现在想要输出内容呢?可能需要另一个函数
def shuchu(people):
for k,v in people.items():
print(k,v)
def luru(people,xm,nn,xb):
people['姓名']=xm
people['年龄']=nn
people['性别']=xb
student1=dict()
luru(student1,'hh',19,'男')
shuchu(student1)
那么现在是一个学生,但如果有很多个学生,我就需要定义很多个dict再把他们放到一个函数里去赋值,而且如果有很多个函数呢?而且他们都是有关学生的相关操作,这样对同一种类型的对象进行操作和初始化的过程,就可以被放进一个大大的类(class)里面。
类的操作
class student:#student是类的名字,下面都要用这个来命名
def __init__(self,name,age,gender):#每个类在被定义的时候都会运行一遍这个初始化函数就是__init_()
self.name=name
self.age=age
self.gender=gender
# 这是初始化函数,一个对象肯定有他的最初信息的,如果真没有,可以pass掉
# 这里的self是表示属于这一类的变量,其实就是student.name,表示这个变量是属于这个类的
# 不加self.的变量不被认为是这个类的变量
def print_xx(self):#这里有没有参数都要加上self表示这是属于这一类的函数
print(self.name)
print(self.age)
print(self.gender)
student1=student('hh',19,'男')
student1.print_xx()
这里对这个self进行一个解释,作用就是说明这个变量或者这个函数是这个类所拥有的,其实你可以把这个self看作是一个躯壳,然后在student1被定义这个类以后,这个躯壳就被装进student1的灵魂了,所以之前就是self.name表示是self的name,然后现在就是student1.name表示是第一个学生的名字。然后你就可以在之后的函数中对其进行使用了,但是注意类里面的函数都要加上self的参数,表示这是这个类的函数,否则会报错。
然后你就可以快乐的使用类对一个变量进行定义,类里的函数也可以使用
(因为调用类的时候要用xx.yy,我有时候觉得这就像一个带了函数的python里类似c++的结构体的东西,区别就是带了函数)
class student:
def __init__(self,name,age,gender):
self.age=age
self.gender=gender
def print_xx(self):
print(self.name)
print(self.age)
print(self.gender)
student1=student('hh',19,'男')
student1.print_xx()
student2=student('nn',20,'男')
student2.print_xx()
student3=student('ww',20,'男')
student3.print_xx()
看,这样是不是就很方便录入信息和进行操作了,优雅~
类的拓展
类的继承
在这里,我们进一步对类进行应用,那么学生之间亦有不同,就像英专生和计算机学生,他们虽然都需要录入相同的个人基本信息,但是英专生需要额外录入他的英语四六级成绩,而计算机学生需要录入他的csp得分,这其实就有所不同了,那么怎么办呢?,我们可以先把他们都认为是学生,然后在学生的基础上再细分英专生和计科生。
class student:
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def print_xx(self):
print(self.name)
print(self.age)
print(self.gender)
class Endlish_student(student):
def __init__(self,name,age,gender,cet4,cet6):
super().__init__(name,age,gender)
self.cet4=cet4
self.cet6=cet6
def print_x(self):
super().print_xx()
print(self.cet4)
print(self.cet6)
class Computer_student(student):
def __init__(self,name,age,gender,csp):
super().__init__(name,age,gender)
self.csp=csp
def print_x(self):
super().print_xx()
print(self.csp)
student4=Endlish_student('gg',20,'男',600,550)
student4.print_x()#他可以输出自己的函数
student4.print_xx()#他依然可以继承父类的函数
student5=Computer_student('gg',20,'男',400)
student5.print_x()#他可以输出自己的函数
student5.print_xx()#他依然可以继承父类的函数
我们可以在定义类的时候在后面加小括号并且输入父类,这样他就可以继承父类的所有变量,函数了,但是需要注意的是,继承函数是指在类以外可以,如果在类里面要使用父类的函数的话,那么需要使用super().这个前缀表示使用是父类的函数。
但是定义好了之后,在使用时,就可以直接使用父类的函数即可(一般不使用初始化函数)。
ps:正因为使用时可以直接使用父类和子类的函数,但是如果子类和父类有两个相同的函数,那么默认先使用子类的函数。
这就叫做类的继承。
类的多态
对于类的复用,即相同的函数发挥不一样的作用,上面ps中其实就是一种复用,会先执行子类的函数,其实也就是,哪种类型执行哪种函数,即使名字相同
def printzhaunye(anystudent):
anystudent.print_x()
printzhaunye(student4)
printzhaunye(student5)
像这种,就可以将每个类的输出函数名字定义成相同的,那么输入是那一类,就会调用哪一类的输出函数,非常的方便,就可以进行一个输出类型的兼顾。
一些细节
对于类的继承来说,如果不想让子类继承父类的函数或者变量,那么可以在前面加上两个下划线__
那么子类中就不会有相关的函数或者变量了,你也找不到他。
并且如果子类想要用父类的变量可以直接当自己的变量用self.name就可以使用,但是如果要调用父类的函数的话就要用super().__init__(, , , , )这种类型才可以
后记
这就是有关类的一些相关知识,我是蒟蒻,有什么做的不好的希望多多指正,下面是两个我学习类用到的资源:
Class 类 | 莫烦Python
【4个项目学会Python 封装和多态】https://www.bilibili.com/video/BV1Kx421C7C1?vd_source=928e7968871dbf10f26b1952d35eabfa
希望可以帮到大家