类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起
1.1定义类的关键字:class
类的实例化:与其它语言不同,python不需要new关键字来实例化类,直接使用:变量名 = 类名()
1.2 类的作用:封装代码
1.3 类中的函数
1.3.1 类中的函数要调用类中的变量时,函数中应添加参数self,否则会报错
1.3.2 类的函数具体调用类中的变量时,要使用“self.变量名”的方式
修改后的代码执行:
注:1.类只负责封装代码,不负责执行代码,若要执行类中的代码,应在类的外部调用执行
2.建议类的声明与实例化不要放在一个模块中
1.4 方法:是设计层面的函数,类中定义的函数可以称做方法
函数:面向过程的概念,直接定义在模块中函数可以叫做函数
直接定义在模块中的变量,一般叫做变量
定义在类中的变量,一般叫做数据成员
1.5 类与对象
类是一个抽象的概念,不具体;对象用于表示一个具体的概念,实例化将类具体为对象
类相当于一个模板,可以实例化出各种不同的对象
2.1 def __init__():
pass
构造函数的调用是自动执行,当实例化对象时会自动执行构造函数
注:构造函数可以有返回值,但是只能返回none,不可以返回任意值,如
修改后的代码:
2.2 类变量与实例变量
类变量与类相关,实例变量与实例相关,类的数据成员也叫做类变量,类使用“self.数据成员”来保存类变量的特征值,“self.数据成员”是类变量的实例对象,也叫实例变量
注:1. self可以任意定义(也可以改为其他单词比如this等),所以self并不是关键字
2. 类变量是写在构造函数外面,实例变量是写在构造函数里面,通过“self.变量名 = 值”的方式存储,在赋值的时候进行存储
以下代码
其中sum1是类变量,name与age是实例变量
在构造函数中,以下代码不会更改数据成员的值
因为python中对象访问变量时,会先从实例变量中查拭,如果实例变量中查找不到就会从类变量中查找,如果类变量中还找不到就会从父类中查找,self本身就代表一个对象
更改后的代码:
2.3 self的特性
1.python不同于其他语言,类似于this作用的self,需要显性的显示出来,类里面的方法在调用到类的数据成员时,方法中第一个参数必须是self
2.对象在调用类中的方法时,不需要再传入self,在调用方法时,会默认传入self
3.self也可以改为其他名字,比如this,所以self不是关键字
4.self表示当前调用某一方法的对象,所以self只和对象有关,与类无关
三、实例方法中访问实例变量与类变量
实例方法的内部,不能直接调用类的数据成员,也不能直接调用类的方法,如:
3.1 使用“self.数据成员”的格式来访问
注:此时是有两个sum1变量,一个是类变量,一个是实例变量,可看以下代码
3.2 使用“类名.变量名”的格式访问
3.3 使用“self.__class__.变量名”的格式访问
3.4 注:“self.变量名”只是访问实例变量,只对实例变量进行操作,而后两种操作是对类变量进行操作,若操作更改了类变量的值,那么之后的对象访问此变量时,值也会更改,如:
3.4.1 使用“self.变量名”进行访问:
3.4.2 使用“类名.变量名”访问
3.4.3 使用“self.__class__.变量名”访问
3.5 注意以下代码:通过类名更改了类变量的值,通过self访问的sum1也会变,但是打印出的__dict__却是空{}
注:这是因为self.变量在进行访问时,会先查找实例变量,如果实例变量没有找到则会去类变量中进行查找,如果类变量中找不到则去父类变量中查找,而以上代码并没有通过“self.sum1 = 值”的方式进行赋值与存储实例变量,所以此时self.sum1访问的是类变量,而不是实例变量
4.1 格式
@classmethod
def 方法名(参数列表):
pass
4.2 作用:操作类变量
注:类变量的值改变后,之后生成的对象,访问类变量会得到改变后的值
4.3 调用格式:类名.方法名()
示例:
注:1.类方法中的参数cls也可以改为self,但是建议采用python给出的建议,使用cls,来做以类方法的区分,cls是class的简称
2.类的外部,也可以使用对象来调用类方法,不会报错,但是建议仍使用“类名.方法名”的格式来调用类方法
使用对象来调用类方法,示例:
3.类的实例方法中虽然也可以对类变量进行操作,但是建议使用类方法来对类变量进行操作,可以使用代码更优雅
4.类方法中不能访问实例变量,会报错
五、静态方法
5.1 格式
@staticmethod
def 方法名(参数列表):
pass
5.2 静态方法中可以访问类变量,不可以访问对象变量,参数列表不用输入self
注:静态方法中访问类变量时,只能通过“类名.变量名”的格式进行访问,使用self.__class__.变量名的格式访问类变量会报错,如图:
5.3静态方法的调用
5.3.1 对象名.方法名
5.3.2 对象名.方法名
注:1.静态方法建议不要经常使用,因为与类和对象的联系比较弱,除非认为这个方法是纯粹的,与类和对象都没有关系,可以使用静态方法
2.python中的类方法与其他语言的静态方法类似
六、成员的可见性
6.1 成员的可见性分为:公开、私有
6.2 公开性:成员变量是公开性质,则在类的外部可以访问此变量,正常书写,默认的就是公开性质
私有性:成员变量为私有性质时,则在类的外部不可以访问此变量,在变量名或方法名前面加双下划线,即可变为私有
6.2.1类变量设置为私有变量:
6.2.2实例变量设置为私有变量:
6.2.3方法设置为私有方法
注:python和其他语言不同,没有public和private来规定此变量是公开的还是私有的,在变量名或方法名前面加两个双下划线,则此变量或方法则变为了私有性质,前后都加双下划线时,不是私有性质,如构造方法__init__(),及内置函数和内置变量
6.3 动态添加变量
以上代码不会报错,是因为student1.__score = -1动态的给student1添加了一个变量__score,而这个__score不是私有变量,只有在类的内部使用双下划线才会成为私有变量,如私有变量存储在__dict__的格式为“_Student__score”,而动态添加的变量在__dict__中存储的格式为“__score”
根据以上__dict__打印的内容,对象也可以访问私有变量,如:
注:没有什么是不可以访问的