这一节课的主要内容是:
1,类。
2,面向对象。
tips:零基础请配套视频学习。
经过前面基础语法的学习,你已经掌握了最基础的python语法,你已经可以使用python做一些简单的小练习题了。
但是针对更高级的编程语言来说,还有一个非常重要的知识点大家还没有学习,那就是——面向对象。
01类面向对象其实是一种编程思想,并不是具体的语法。然而面向对象所谓的对象,其实就是这里将要讲的——类。
01.1类的定义类,其实就是对现实世界中存在的物体抽象模拟而已。
现实世界中存在许多东西,飞机,汽车,人,动物等等。我们可以将具体事物抽象为含有指定属性与方法的类。
值得注意:现实世界中的物件经过抽象之后,基本上就可以归结为两方面的内容:
属性。属性讲述了当前物体的一些特征,比如:狗狗的特征有姓名,年龄,性别等等。
方法。方法讲述了当前物体可以做什么事情,比如:狗狗可以做的事情就是睡觉,坐下,狗吠等等。
当然,一个物件的属性与方法多的很,我们选取属性与方法的时候都是选取对我们来说有用的就好了。
案例一:模拟出狗狗的类别。
这个案例的目的是:使用python模拟出一个狗狗类。
#1,定义类的关键字是class,Dog()是给这个类起的名字。classDog():#2,__init__(self)方法是每个类必须要有的方法,他是给Dog初始化数据的。def__init__(self,name,age,sex):#3,这里是对Dog的一些属性初始化。self.name=nameself.age=ageself.sex=sex#4,接下来的一些方法是Dog类可以执行的哪些操作。defsleep(self):print(self.name,"issleeping")defsit(self):print(self.name,"issitting")
解释:
1,定义一个Dog类,首先知道使用class作为关键词来定义,于是classDog()就可以定义出一个Dog类。具体语法框架如下
2,每一个类都必须有__init__(self,a,b,c):方法,这个方法是初始化方法,当使用这个类的时候__init__方法不用调用自动执行。其中a,b,c是传递的数据(没有数据传递的时候可以没有),self代表着当前类本身(self必须存在)。
3,类似于self.name=name的一些操作就是将传递过来的数据name给当前Dog类的self.name属性进行赋值而已。
4,除了__init__方法是类必须含有的初始化方法外,其他方法都是自己定义的一些方法,自定义的方法指示着当前类Dog可以执行哪些操作,当前Dog类定义了sleep,sit两个操作。
总结:通过上述代码我们就定义出了一个狗狗类,这个狗狗类拥有三个属性name,age,sex,两个方法sleep,`sit。
接下来就讲讲类怎么使用。
01.2类的使用在上文中我们定义出了一个Dog类,这里就来讲讲类怎么使用。
上文中我们定义出了一个Dog类,同时我们说了这个Dog类是对所有狗狗的抽象类。既然他是所有狗狗的抽象类,那么我么就可以使用这个抽象类来得到许许多多的具体的狗狗。
案例二:使用抽象Dog类得到具体的狗狗。
classDog():def__init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdefsleep(self):print(self.name,"issleeping")defsit(self):print(self.name,"issitting")#1,得到第一支狗狗dog_1。dog_1=Dog("小花",6,"母")#2,得到第二支狗狗dog_2。dog_2=Dog("小红",4,"母")#3,得到第三支狗狗dog_3。dog_3=Dog("憨狗",7,"公")
解释:
通过dog_1=Dog("小花",6,"母")语句便可以获得一只真实的狗狗,上文中定义出的Dog()类需要传入三个属性值name,age,sex,于是我们就在括号中传入三个数据,然后得到一只狗狗存放在变量名dog_1中。同时可以知道变量名dog_1指向的狗狗名字叫做小花,6岁,是只小母狗。
dog_2,dog_3的定义类似。
01-3类的使用分析这里分析一下类的具体运作流程。
案例三:类的使用。
classDog():def__init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdefsleep(self):print(self.name,"issleeping")defsit(self):print(self.name,"issitting")#1,得到一只狗狗,存放在变量dog_3中。dog_3=Dog("憨狗",7,"公")#2,输出一下dog_3的name属性。print(dog_3.name)#3,调用一下dog_3的sit()方法。dog_3.sit()
运行结果:
分析:
首先,定义了一个抽象的Dog类
然后,使用dog_3=Dog("憨狗",7,"公")得到一只真实的狗狗。
当我们传入数据"憨狗",7,"公"的时候,init方法会被自动调用,然后给数据赋值。
最后得到这个狗狗的name是憨狗,7岁,是一只公狗,并且将这只真实的狗狗存放在dog_3变量中。
dog_3拥有三个属性以及两个方法,于是直接用dog_3.name就可以得到属性中的name属性,也就会得到dog_3的名字,然后输出。(属性直接用变量名.属性就可以了)
dog_3.sit()就可以调用方法sit()了,于是会执行sit()方法的内容。(方法需要使用变量名.方法())。
02面向对象好了好了,上边类的使用过程其实就是面向对象的编程思想。在这里再做一下总结吧。
当我们定义具体事物的抽象类之后,这个类就可以看作是一个模板。
就好像我们买橡皮泥的时候,会赠送一些模具,有小车、小狗、小猫,小花那样的形状的模具。
这里的类就相当于是一个模具。
然后我们使用类这个模板,来得到一个个的具体事物。(实用类得到的具体事物又称之为”实例“)
就好像使用橡皮泥中的小花这个模具,得到一个个的小花。
于是,我们可以发现:世界中的所有事物都可以抽象为一个一个的类。
刚才我们一直提“事物”这个词,但是在计算机中,现实世界中的事物又被称之为“对象“。
对象是指现实事物,类是对象(现实事物)的抽象。
我们将现实世界中的对象—抽象为类—然后在使用类得到一个个具体的实例的过程们就称之为面向对象。
03类的继承与重写类也有一些专业的名词与操作,可以提高编码效率,这里简要介绍一下常用的。
继承:继承其实就好像儿子从父亲哪里得到已有的内容,然后儿子可以用。
重写:重写就是儿子从父亲那里得到一些内容之后,但是这些内容不太适合儿子,儿子就把父亲的东西修改一下,变成自己所特有的内容。
03.1继承继承:一个类(子类)从另一个类(父类)哪里得到一些东西。
注意:子类与父类要有因果关系才可以哦。(也就是不能瞎继承)
案例四:继承演示。
先定义一个动物父类(动物都可以吃东西,叫),然后再定义一个小猫子类(小猫可以逮老鼠)。
子类小猫属于动物父类,所以可以继承动物父类。
classAnimal():def__init__(self,name,age):self.name=nameself.age=agedefeat(self):print(self.name,"动物可以吃东西")defcall(self):print(self.name,"动物可以叫")classCat(Animal):def__init__(self,name,age,sex):super().__init__(name,age)self.sex=sexdefCatcheMouse(self):print(self.name,"猫可以捉老鼠")cat=Cat("小花猫",4,"公")cat.call()cat.CatcheMouse()
结果:
解释:
首先定义父类。
然后定义子类,并且子类继承父类。
super().__init__(self,name,age):super()就是父类,然后他调用父类的init方法,并且传入两个数据。
然后使用Cat类得到实例:cat=Cat("小花猫",4,"公")。
最后调用:发现使用子类定义出来的实例也可以调用父类,这正是继承起到的作用。
总结:上述分析可知,Cat子类继承了Animal父类之后,使用Cat定义出来的实例cat含有自己方法CatcheMouse之外还拥有父类Animal所具有的两个方法eat和call。这就是继承。
03.2重写重写就是在继承的基础之上,子类得到了父类的一些东西,但是这些东西子类用着不太合适,所以子类要把这些东西修改为自己适合的。
于是子类在自己的类中,重新定义父类的一些东西,重新实现一下。
案例五:重写案例。
父类是Animal,子类是Owl(猫头鹰)。
父类中有一个方法sleep说的是动物都是晚上睡觉。
但是子类是猫头鹰的时候,这个子类是白天睡觉,所以父类的sleep方法不适合这个子类,于是在这个子类中重写一下sleep方法就好了。
classAnimal():def__init__(self,name,age):self.name=nameself.age=agedefeat(self):print(self.name,"动物可以吃东西")defsleep(self):print(self.name,"动物晚上睡觉")classOwl(Animal):def__init__(self,name,age,sex):super().__init__(name,age)self.sex=sexdefsleep(self):print(self.name,"猫头鹰白天睡觉")cat=Owl("小猫头鹰",4,"公")cat.eat()cat.sleep()
结果:
解释:
总结:子类继承父类之后,父类的方法不一定完全合适,这时候子类就可以重新实现一下父类的不合适的方法即可。这就是重写。
小小猿笔记测试一下功能而已。