析构函数:
系统定义的函数
def __del __ (self):
pass
析构函数不需要我们自己手动调用,当对象被销毁的时候会自动调用。
对象啥时候会被销毁:
1.当程序运行结束的时候
2.显式销毁对象(del 对象名)
self的使用
1.self代表什么?
代表的是当前类的实例【对象自己本身】
2.self是否为关键字?
self并不是关键字可以使用别的变量名来代替,但是self是我们约定俗成的写法,
不建议使用其他的名字。
3.self可否省略?
self不能省略,并且它必须写在参数列表中第一个位置,声明的必须的要声明,传递参数的时候,不需要我们手动传参。
类变量:
定义在类中,并且定义在函数体之外的变量,我们称之为类变量【静态成员变量】
类变量通常情况不使用对象来进行调用,而是使用类名来进行调用,类变量在整个实例化对象的过程中是公用的。
类变量的调用:
类名.变量名
注意:若使用对象来进行调用也不报错,但是一般不建议这么使用。
成员变量:
定义在类的函数中,并且要绑定在self身上的变量我们称之为成员变量,只作用于当前实例。
类变量与成员变量的区别:
1.定义位置不同
类变量直接定义在类中变量,成员变量是定义在方法绑定在self身上的变量
2.访问方式不同
类变量使用类名【使用对象访问不报错】
成员变量使用对象来访问 【使用类名来访问的时候会报错】
3.在内存出现的时机不同,类变量随着类的加载而出现,成员变量实例化
对象的时候创建
4.调用的优先级不同,当使用对象来调用类变量与成员变量的时候,
优先选择成员变量,若成员变量不存在,则去访问类变量
5.通过对象来更改类变量的值的时候,更改的是当前对象的值【只会影响
当前对象】,通过类名来更改类变量的值的时候,更改类变量的初始值【会
影响在类变量更改之后创建的所有对象】。
动态添加属性和方法
正常情况下,当我们定义了一个类(class),我们创建类的实例之后,我们可以给该类的实例绑定任意的属性以及方法,这就是动态数据类型语言的灵活性。
在python中,我们可以使用__slots__
变量来限制我们动态添加的属性以及方法。
注意:__slots __ =()
的值为一个元组,元组中使用字符串进行声明可以动态添加
的属性以及函数的函数名。只作用于当前类的实例,对继承的子类不起作用,除非在子类中也定义slots,这样子类实例允许定义的属性就是自身的slots加上父类的slots。
类中的函数/方法分为三大类:
1.成员方法
一般情况下在类中定义所有的方法我们都称之为成员方法,在成员方法中,它的第一个参数
self,声明的时候必须声明在参数列表中第一个位置,使用对象来进行调用的时候,对象会
将自己作为参数自动传递给self,不需要我们手动传递。
成员方法是给对象准备的,调用的时候必须使用对象来进行调用。
2.类方法
类方法是专门给类准备的方法,它不是绑定在对象身上,而是绑定在类身上的方法,
在声明类方法的时候我们通常情况下使用@classmethod
装饰器来进行声明。
在类方法中,参数列表的第一个位置的参数是cls
,代表类本身,使用类名来进行调用的
时候类会将自己作为参数自动传递进来,不需要手动传递。
调用类方法的时候建议使用类名来进行调用,若使用对象来进行调用也不报错,
但是会让别人造成误解。
3.静态方法
一类普通的方法,但是写在了类中。声明静态方法的时候使用@staticmethod
来进行声明,调用的时候建议使用类名来进行调用,若使用对象来进行调用也不报错。
成员方法,类方法,静态方法使用契机:
成员方法:
当此方法中有使用到self【对象】/成员变量 的时候,必须将此方法写成成员方法。
类方法:
当此方法中没有使用到self/【成员变量】/成员方法,但是它使用到了类变量,
这时候我们必须将此函数写成类方法。
静态方法:
位于类定义的命名空间中,此方法中没有使用到成员变量,也没有使用到类变量,不会对任何实例类型进行操作,就是一个普通的方法,这时候我们可以将此函数写成静态方法。
面向对象的三大特征:
封装, 继承, 多态
封装:
广义的封装:类与函数的定义就是封装的体现。
狭义的封装:类中的有些属性我们不希望外界能够直接访问,我们可以将这些属性
进行私有化只有本类持有,再给外界暴露出一个访问的接口即可。
封装的本质:属性私有化的过程
封装的优点:提高数据的复用性,保证数据的安全性
使用方法:
如果要让内部的属性不被外部访问,可以把属性名前加两个下划线,在python中以双下划线开头的变量就变成了一个私有的变量,只有内部可以访问,而外部不能访问。
对于私有化的属性我们可以对它进行数据过滤
语法糖:
@property
功能:可以将函数转为属性来进行调用。
将@property添加给getter头上,将getter变成一个属性来进行调用
与此同时,@property还会生成一个新的装饰器,这个装饰器的名字叫做
@属性.setter
的装饰器,这个装饰器可以将setter方法变为属性赋值。
优点:方便调用者写出更加简洁的代码。
访问私有化属性的黑魔法
被私有化的属性不能直接访问的原因是解释器在解释我们的属性的时候
将被私有化的属性解释为_类名__属性名
,因此我们直接使用对象.__属性名
是访问不到的,但是若我们使用对象._类名__属性名来进行访问,是可以访问的。
但是不建议这么干,因为不同的解释器解释出来的变量名可能不相同。