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