黑马程序员学Python——类和对象
本文主讲:Python面向对象编程中的创建类及其实例化对象等方法…..
什么是面向对象?
举一个例子,洗衣服有两种方法:第一种是手洗,第二种是洗衣机洗衣服,手洗特别麻烦,步骤特别多,而洗衣机洗衣服只需要一个洗衣机(事物),步骤少,特别简单。
面向对象:简单来说面向对象就是创造事物(洗衣机),使用这个事物做事情(洗衣服)的过程
面向对象优点:操作简单,简化代码,步骤少
理解类和对象
前面说了面向对象其实就是制作事物(洗衣机),使用这个事物做事情(洗衣服)的过程,流程图如下
答:面向对象大致流程为 图纸→制作事物(洗衣机)→使用事物(洗衣服)
在面向对象编程中有两个重要组成部分,那就是类和对象
一:那什么是类和对象呢?他们之间有什么关系吗?
类其实就是制作事物的图纸,对象就是制造的事物(洗衣机),因此类和对象的关系就是,类可以创建(实例化)对象
快速代码体验
因此最后总结为面向对象编程流程:类→创建对象→对象做事情
类和对象详解
什么是类?
答:类就是一些具有相同特征(属性)以及行为(方法)的事物统称,不是真实存在的。
什么是对象?
答:对象是根据类制造出来的事物,是真实存在的。注意现有类再有对象
注意事项
在以后的需求中,有几个不同种类对象就有几个类
面向对象编程
面向对象编程的流程:根据类(图纸)→创建对象(洗衣机)→利用对象做事情(洗衣服)
注意事项:
1:类名第一个字母要大写,符合大驼峰命名规则
2:一个类中要有属性和方法(函数)
3:类和对象是面向对象编程中重要的两部分。对象是根据类创建出来的,先有类再有对象
4:一个类可以创建多个对象
5:下面一整段代码就是面向对象编程的流程
6:self指的是什么呢?self指的是利用类(图纸)创建对象的名字,下面代码中self就是m1对象名
快速代码体验
理解self
魔法方法
一:什么是魔法方法呢?
答:魔法方法指代具有特殊功能的函数,一般这么写,_ 函数名 _()
二:魔法方法_ init _( ) 初始化函数
功能:在面向对象编程中给对象赋予一些与生俱来的属性(初始属性),即在类(图纸)中就设定好的属性
语法:def _ _init_ _(self)
注意事项:
1:在利用类创建对象时,类中的_ init _(self)方法是自动调用的,不需要手动调用
2:self其实就是利用类创建的那个对象的名字,下面这段代码,self就代表car1这个对象名
快速代码体验
三:魔法方法 _ str _(self) 修改对象打印值函数
功能:在类中没有定义_ str (self)方法打印类创建的对象时,打印的是这个对象的地址,如果定义了 str _(self),打印对象时则打印这个方法的返回值,一般返回值是这个类或者对象的说明文档
语法:
1 | def _ _str_ _(self): |
快速代码体验
3.1 在类中没有定义_ str _(self)方法时
3.2 类中定义了_ str _(self)方法
四:魔法方法_ del _(self)
功能:当利用del删除利用类创建的对象时,python解释器会自动调用魔法方法_ del _(self),即打印方法下方的代码
语法:
1 | def _ _del_ _(self): |
注意事项:当整个程序运行结束后,计算机会自动删除对象,释放内存。因此在不主动删除对象时,程序运行结束后,魔法方法_ del _(self)也会自动调用
快速代码体验
类属性的默认值
怎么给类的属性添加默认值?注意事项是什么?
答:直接在魔法方法_ init _(self)下面初始化属性的位置给类的属性赋予默认值
注意事项:如果类中有默认值属性,那么在创建对象时,不需要再传递默认值属性的值
新式类与旧式类
什么是新式类与旧式类,他们两个之间代码有什么区别吗?
答:新式类是在python解释器3.0以上类的书写方法,旧式类是python解释器2.0书写类的方法
新式类代码( 括号里面的object默认是所有类的父类,叫基类或者顶类,其余的类都叫派生类 ):
1 | class 类名(object): |
旧式类代码:
1 | class 类名: |
面向对象进阶——继承
一:体验继承
继承:继承就是多个类之间的所属关系,子类默认继承父类的所有属性和方法
注意事项:
1:子类的括号里面填写的是要继承父类的名称
2:利用子类创建对象时,括号里面不能写继承的父类
快速代码体验:
一:父类属性有默认值时(self.num = 1)
二:父类属性没有默认值时(self.num = num)
单继承
单继承故事推进:比如说有一个老师傅会用古法秘方摊煎饼,因为年纪大了,要找到自己的唯一接班人,将自己的秘方传授给徒弟,因此这种一个徒弟被一个老师教的场景就可用单继承,也就是说,一个子类继承一个父类,换言之,独生子女继承父亲的财产。
单继承快速代码体验:
多继承
多继承故事推进:一个学徒想学习摊煎饼果子技术,因此先找了张师傅学习了摊煎饼果子技术,随后又找到赵师傅学习摊煎饼果子技术。这种一个子类继承多个父类的模式就叫做多继承。
多继承:一个子类继承多个父类的属性和方法
语法: class 子类名(父类1,父类2)
注意事项:如果一个子类继承两个父类,这两个父类中有同名的属性和方法,则子类在创建对象调用父类的同名属性和方法时,默认调用第一个父类的同名属性和方法。
快速代码体验
子类重写父类的同名属性和方法
故事推进:一个学徒学习了一位老师傅摊煎饼果子的技术,这位学徒在这位老师傅的煎饼果子技术下研究出了全新的技术,这就是子类重写父类的同名属性和方法,换言之,一个子类继承了父类的属性和方法后,子类又重新定义了与父类同名的属性和方法。那么子类在创建对象时,调用属性和方法默认调用的是子类重写的属性和方法。
子类重写父类的同名属性和方法(子类继承父类的属性和方法后,子类重写与父类同名的属性和方法)
注意事项:用子类创建对象,并且调用子类中与父类同名的属性和方法,默认调用子类重写的同名属性和方法
快速代码体验
子类调用父类中同名的属性与方法(下面super()与这个功能一样)
你问我答:子类继承了父类的同名属性和方法后,重写了父类的属性和方法,在利用子类创建对象调用属性和方法时,默认调用的是子类重写父类重名的属性和方法,那我们怎么调用父类中与子类重名的属性和方法呢?(p300集)
答:在子类中对父类中同名的属性和方法进行封装(函数封装) 注意事项:在类中只要定义或者调用了函数,括号里面都要加上self,用于接收对象。
实例:子类重写了父类同名的属性和方法后,子类在创建对象时默认调用的属性和方法默认是重写的属性和方法,我们想办法在子类创建对象时也可以调用父类的属性和方法
重要代码截图:
__mro__顺序
功能:__mro__顺序用于快速查看某个类的父类有哪些,以及这些父类的层级关系
语法:子类 . __mro__
注意事项:所有父类都会默认继承基类(object)
快速代码体验
类和对象的__dict__属性
你问我答:类和对象的__dict__属性有什么功能?
答:__dict__属性是类和类创建的对象(实例)所共有的属性,当类调用__dict__属性时,返回的结果是类中所有类属性和类方法(注意是类属性,不是实例属性)对应的字典,当类创建的对象调用__dict__属性时,返回的结果是实例属性和实例属性的值对应的字典
快速代码体验
类的继承羔羊小结
小结一:利用类创建对象,并且调用某个方法时,会在这个类里面寻找这个方法,如果这个类里面没有这个方法,就会按照__mro__顺序依次在父类中寻找这个方法,如果寻找到基类object依然没有找到这个方法,则程序报错,找到这个方法就调用这个方法。
小结二:下面这段关于调用方法的程序为什么会报错?
报错分析:
纠正代码:
多层继承
什么是多层继承?
答:继承关系大于等于两种的叫多层继承!!
多层继承代码演示
super()调用父类方法
一:super()的作用
功能:利用super()调用当前类的父类中的方法
语法:
1:super(). 父类中函数名
2:super(当前类名 ,self ). 父类中函数名
注意事项:两种super()语法功能一样,因此工作时推荐使用第一种,简化代码
快速代码体验
1:super(当前类名,self). 函数名
2:super(). 函数名
私有权限
一:什么是私有权限?
答:私有权限就是在继承的时候,不把设置为私有权限的属性和方法继承给子类,因为继承默认是继承父类的所有属性和方法
二:定义私有属性和私有方法
功能:将类中的属性和方法设置为私有,这样在继承的时候就不会将设置为私有属性和方法继承给子类了
代码实现:在设置为私有属性和方法的前面加上两条_ _,这样就将属性和方法设置为私有的了
快读代码体验:
子类获取和修改父类中的私有属性值!!
一:怎么在子类中获取和修改父类的私有属性值?
答:在父类中定义函数 get__私有属性名() 用来子类获取私有属性值,在父类中定义函数 set__私有属性名()用来子类修改私有属性名
注意事项:一般这种情况应用于子类继承父类然后访问或者修改父类中的私有属性值,因为默认父类不把私有属性继承给子类
快速代码体验(截图原因,没有展示子类继承父类后查看和修改父类的私有属性值)
面向对象编程三大特征(面试常考题目)
特征一:封装
1:将属性和方法写到类里面就是封装
2:可以将类里面的属性和方法添加私有权限
特征二:继承
1:子类默认继承父类的所有属性和方法
2:子类可以重写与父类同名的属性与方法,即子类可以拥有自己的属性和方法
特征三:多态
1:传入不同的对象,产生的结果不同
了解多态
什么是多态?
多态定义:多态是一种使用对象的方式,定义多个子类后,继承相同父类并重写父类方法,调用不同子类创建的对象的相同父类方法,可以产生不同的结果。
多态优点:调用灵活,有了多态更容易写出通用的代码
注意事项:python多态并不必须依赖于继承关系,但是最好有继承关系
多态步骤:
1:定义父类,并书写公共方法
2:定义多个不同子类继承相同父类,并重写父类公共方法,不同子类创建多个对象
3:传入不同对象,调用相同的父类方法其结果不同(其实就是,不同子类创建不同对象,然后调用相同父类方法,结果不同)
快速代码体验
类属性
一:什么是类属性
答:类属性就是类所有的属性,他被类所创建的所有对象拥有
二:怎么设置类属性?
答:在类里面直接书写代码 属性名 = 属性值 这就定义了类属性
三:怎么访问类属性?
答:直接利用类访问,或者利用类创建的实例也可以访问
快速代码体验
怎么修改类属性
一:怎么修改类属性?
答:前面说过访问类属性有两种方法,一种是直接通过类名访问,另一种是通过类创建的对象访问,但是修改类属性方法只有一种方法,那就是通过类名来修改
二:利用类所创建的对象修改类属性为什么不可以?
答:因为利用类创建的对象修改类属性不是真正的修改了类属性,而是生成这个对象的实例属性,并没有修改类属性
类方法
一:什么是类方法?
类方法特点:需要用装饰器@classmethod来标记类里面的函数,告诉外界这是类方法,被装饰器@classmethod标记的类方法第一个参数就是cls,代表当前类
类方法语法:
1 |
|
二:类方法使用场景
答:类方法一般和类属性配合使用,当要操作(访问、修改等)私有类属性和类属性的时候,定义类方法
快速代码体验
静态方法
一:什么是静态方法?
答:通过装饰器@staticmethod标识的函数就是静态方法,通过装饰器@staticmethod标识的函数是没有self以及cls形参的,其中self代表传入类创建的对象,cls代表传入当前类。
静态方法也可以通过类访问,也可以通过对象来访问!!!
二:静态方法使用场景
答:当类中的方法(函数)不需要传递对象(self)以及类(cls)参数时,就可以定义静态方法
三:静态方法优点
答:取消不需要的参数传递(对象self以及类cls),可以节省内存,减少不必要的内存占用
未完待续….