python 编程_类的学习笔记(from刘金玉b站教程)

一、类的定义
在面向对象里面,对象和类是不同的,对象是特定类的一个实例,比如如果车是一个类的话,某个人的一辆奔驰车就是一个对象,它是车这个类的实例。
类是抽象的,而对象是具体的。方法是定义在对象上的操作,属性是记录对象性质和状态的变量,拿上面车的例子来说,车的重量,最大速度是车的属性,启动,停下这些动作则可以定义为车的方法。
理解为现实生活中的一个类别。比如:人类、动物等,有大类、有小类。
得到的其实:类其实是比较抽象的一个归类,并没有涉及到具体的事物

对象:
理解为:某一个类别的具体的实例化的事物
比如就是人类的实例化“小李”

类的定义
使用系统关键词class
class类的名称:
       类的属性和方法

说明:类其实就是一个代码块
这里提到的“方法”,其实就是我们之前学过的函数,只不过在类的外面定义的时候叫做函数,在类内部定义的时候,就叫做方法。


类的定义的举例:
class person:
    def setage(self,a):
        self.age=a
    def getage(self):
        return self.age

如何应用类:
使用类的时候,必须要进行类的实例化,而实例化之后的类,我们称之为对象。

如何实例化一个类
只需要早类名称后加一个小括号即可
举例:
p = person()
这里的p就是person这个类的实例化对象

实例化之后的类如何使用
举例:
p = person()
#设置年龄
p.setage(18)
#获取年龄
print(p.getage())


类的特性:
1.继承:父级的方法会被子集继承下来
2.封装:把某些特定的方法封装在一个类下面,使得某个具体执行的功能会比较隐蔽,代码看起来也会比较清晰
3.多态:同一个方法在不同的场景下面会有不同的效果。
由之前的例子,我们得到:每一个类中的方法在定义的时候,第一个参数必定是类的对象,一般这个参数的名字默认为是self
,也可以是其他的变量的名称,但是默认情况下第一个参数无论是什么名字,都被默认为是这个类的对象本身


类的应用场景:
往往都是对应于现实事物的各个对象:比如贪吃蛇中的蛇或者是事物。

比如业务中某个系统中的人的某个数据表,等等现实生活中的场景。

总结:
1.掌握类和对象的概念
2.掌握类和方法的定义
3.掌握类和对象的调用和使用方法
4.理解类的应用场景


二、类的属性方法和私有化
私有化的概念:往往就是指只能被某些特定的对象调用
1.属性:类似于人的身高,职业,性别等均成为属性
注意:类的属性默认情况下是直接被开发出去,可以直接调用赋值的
补充:在类的内部不同方法之间是可以调用类的同一属性的

私有化:其实只要在方法名前加两个下划线即可
举例:
    def __sayhello(self):
        print("hello,"+self.name)

而实际上,这种类型的私有化并不是绝对不能被调用的,我们可以采用在类的名称前加一个下划线以及定义的装个私有方法名的拼接组合一个新的方法名称就可以调用
举例:p._person__sayhello()

为什么私有化的类可以被调用呢?
在python中私有化的类方法在被编译的时候,实际上是在这个方法名称的前面拼接了下划线和类的名称

私有化的调用方式如何知道的呢?
使用inspect库进行访问

import inspect
methonds=inspect.getmembers(p,predicate=inspect.ismethod)
print(methonds)
注意点:inspect.getmembers(类的对象,刷新依据)

结论:无论是类的方法还是类的属性,只要在方法或者属性名称前面加两个下划线,那么就会被python

编译器自动私有化,会在这个名称前面加上一个_类的的名称

总结:
1.掌握类的属性的定义和调用
2.掌握类的方法的定义和调用
3.掌握类的属性和方法的私有化
4.掌握使用inspect库来查看类的所有属性和方法的成员


三、类的继承

类的代码块:
在定义的时候,使用“:”
这个冒号在python中表示一个代码块的开始
类代码块中的代码同样是自上而下被调用的

注意点:
1.代码实例化一个类后,如果在方法外写的代码会直接被运行
2.类中写的变量名称,自动会被认为类的属性,这个属性可以该类的方法调用

类的继承:

继承:子类可以继承父类的方法和成员,
继承的代码定义:
class 父类名称:
      父类成员
     class 子类名称(父类名称):#这里体现了继承的定义
              子类成员

注意:子类继承父类后,可以直接实例化子类,那么父类当中的属性和方法都可以被子类调用

类继承的好处:
1.可以提取类的公共特性
2.容易理解类之间的关系
3.使得代码更加简化,更能表示现实事物的对象及关系。
4.如果子类继承的父类还有继承关系,将继承所有父类的方法。

总结:
1.类代码块,可以通过类的实例化就可以输出,类中代码的效果,主要理解代码块读取的顺序
2.类的继承,掌握类继承的定义以及类的调用方法,继承了哪些

四、检测类与对象
检测类
检测一个类是否是另一个类的子类(issubclass)
应用:一旦检测到一个类是另一个类的子类后,实际上就可以调用父类中所有的方法和属性
补充,好的开发习惯,在定义类名字的时候,我们往往将单词首字母大写
第一个参数是子类的类名,第二个参数是父类的类名
issubclass(Teacher,Person)
法二:使用魔法方法查看父类
print("使用魔法方法查看父类",Teacher.__bases__)
使用魔法方法查看父类 (<class '__main__.Person'>,)
不能通过实例化得到对象查看类的父类

检测对象:

使用isinstance函数,有两个参数,第一个参数是某个对象,第二个参数是某个类的类名,结果返回第一个参数的对象是否是第二个参数的类名实例化而来的。
如果是实例化的对象,就返回true,否则就返回false
这里要注意:第一个参数的实例化对象如果他的类有父级继承关系,那么第二个参数中的类名如果是父类的类名,结果也会返回true
举例:
isinstance(teach,Teacher)

总结:
1.issubclass 函数检测一个子类是否是父类的子类
2.__base__魔法属性来查看所继承的父类
3.isinstance函数检测一个对象是否是另一个类实力化而来的对象
issubclass(Teacher,Person)这个函数第一个参数的类名是第二个参数的类名,那么结果返回true,否则返回false。

复习:issubclass是否是子类
__bases__获取类的所有父类
isinstance函数检测是否是某个类的实例

五、多继承

类似于C++中某个类一次可以继承多个父类,所有被继承的这些父类的方法和属性都将可以被子类使用。
注意:如果所继承的父类的方法相同的情况下,那么按照从右到左的方向,依次由写在左边的类的方法覆盖右边的类的方法
如果某个类的方法与继承父级中有相同的方法名称,那么我们的结果就是以这个子类的方法名称作为最终的方法

如何查看继承的多个父级类有哪些
可以通过子类的__bases__(注意这里有两个下划线)

总结:
1.掌握多继承类的定义
2.掌握查看多继承类的魔法属性
3.掌握多继承类的调用规则
4.掌握属性的继承规则

python中属性的继承规则
通过测试:我们发现属性的继承规则和方法的继承规则是一样的


复习:
类的多继承
掌握的是多继承类的定义的写法
理解类的同名方法的优先级
__bases__查看一个类的多个继承父类


六、类的接口
在python中没有接口的概念
接口:理解为一种规范,定义一种接口,实际上是定义一个规范,那么一个接口类可以定义为多个规范。
每个规范实际上是一个函数(方法)名称

接口的实现:通过具体的继承这个接口的类来实现


python中采用方法判断代替接口是否存在 
Hasatrr(参数1,参数2),如果参数1对象中有参数2的方法,那么就返回True,否则就返回false
参数1:某个实力化的对象
参数2:某个方法名称,用字符串类型表示

通过测试,我们知道hasattr函数同样适用于类的属性,
getattr函数
getattr(参数1,参数2[,参数3])
参数1:某个类的对象,
参数2:某个类的方法名称,注意:这个方法名称不要加小括号,
参数3,默认函数,这个方法可以省略,单数被省略的情况下,参数2这个方法名称不存在的化,这个函数会直接报异常。
如果参数3没有被省略,那么getattr函数的结果,在参数2不存在的情况下,会返回参数3,使得结果不会报错。注意:参数3
在写的时候不要加()。一旦加了小括号,参数3这个方法名称会被认为自动执行
这里的参数3中的方法名称不一定是要在类的内部的,
同样的,这个函数也可以适用到属性的获取上

setattr函数:设置对象的默认
setattr(参数1,参数2,参数3)
参数1:某个类的实例化对象
参数2:需要设置的某个类的新的方法或属性名称
参数3:对象参数2中的方法或属性名称的具体值
如果参数2是一个属性,那么参数3可以直接设置这个属性的值
如果参数2是一个方法,那么参数3可以设置自定义的某个方法名称,这里不要写成字符串的形式,而是直接写某个方法名
如果参数2中的方法名称与对象原有的方法或属性相同,那么以新设置的为准

总结:
1.掌握接口的概念
2.掌握hasattr判断某个对象是否有某个属性或者方法
3.掌握getattr函数获取某个对象的方法或属性,并可以给与一个默认值
4.掌握setattr函数设置某个对象的方法或者属性

七、类的构造方法


复习:python中接口的概念
1.hasattr函数
2.getattr函数
3.setattr函数

构造方法:类开始实例化的时候最先初始化的方法
定义类的构造方法:__init__魔法关键字,
作用:往往对某个对象进行初始化(实例化)的时候,对数据进行初始化

类的构造方法定义格式

class 函数名称:
        def __init__(self,此处定义需要输出化数据的形参):
                   构造方法的实际代码处理块

         接着是其他的类的方法

构造方法的重写:
如果是继承关系,那么子类也有构造方法

如果子类存在构造方法,继承关系成立后,最终的结果也可以是以子类的构造方法为准

这个重写只是逻辑上表面重写,
总结:
1.掌握构造方法的定义
2.理解构造方法的重写和调用

八、调用父类同名方法
复习:
类的构造方法:__init__魔法方法
由于类的继承导致肯覆盖同名的构造方法,导致只能使用子类的构造,而无法调用父类的构造方法,但其实可以采用super方法解决这个问题

super函数

super()方法用来解决子类中调用父类同名构造方法
python版本过渡,在2.x版本中往往携程super(所在类类名,self),而在3.x版本开始后,就直接可以简写为super()来直接调用父类中的构造方法

通过实际测试,我们知道:
1.super方法可以用在类中的任意函数中,去调用父类中的方法
2.super方法也可以调用超类中的方法

超类:
student类是person的子类,runstudent类是student类的子类,那么我们可以称runstudent类是person类的超类

总结:
1.掌握super方法在两种不同python版本中的不同写法
2.掌握super方法可以调用类和超类中的所有的同名方法
3.掌握super方法调用类中同名函数的方法调用顺序,默认是优先调用父类中的同名方法

九、自定义序列的实现

序列:字典、列表、元组、字符串等
字典:使用符号:{key:value}
元组:()
列表:[]
字符串:”  “ ,‘    ’

序列的的原理

在调用序列的时候,其实一些操作对象魔法方法:
len获取长度,对应__len__;
增加字典的键值对,通过对字典名称【键】=值 获取,对应__setitem__;(其他序列类似)
获取字典的值,使用字典名称[键];,对应__getitem__;
删除字典某个键值对,使用del字典名称(键),对应__del__

自定义类的序列:
通过序列的各项操作与魔法方法的对应关键,我们可以自定义一个自己的序列

总结:
1.掌握序列的实现原理
2.掌握类的自定义序列方法
__len__
__setitem__
__getitem__ 
__delitem__


十、继承内建类、自定义列表与字典

复习:自定义序列(列表、字典)

__len__ 获取序列的长度 ,触发于 len函数
__setitem__设置序列,触发于 类名[ 键]=值
__getitem__ 获取学历,触发于类名[键]
__delitem__删除某个元素  ,触发于 len函数


学习内建类的目的
1.提高写代码的效率
2.利用内建类,可以提供更多的功能

python中为序列提供的类
list:内建列表类
dict:内建字典类
str:内建字符串类

内建:
解释:就是python编译器默认提供给我们的类库,我们可以里这些类,来简化我们程序,增强我们的自定义类的功能

新建一个MyList类
格式:
class MyList(list):
    #利用list内建类,有一个可变参数传入
    def __init__(self,*args):
        print("实例化")
        super(MyList,self).__init__(*args)

使用内建类的好处,
不需要手工实现__setitem__,__getitem__等,就可以实现内建类拥有的功能。

自行实现字典类:(类似于实现一个列表类)
class MyDict(dict):
    def __init__(self,*args):
        super().__init__(*args)

md=MyDict({"a":"小李","b":"小王"})
print(md["a"])

总结:
1.掌握内建类有哪些
2.掌握实现内建类的好处
3.如何定义实现内建类
4.如何灵活应用内建类

十一、深化内建类学习,自定义字符串类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值