self,类变量,成员变量,动态属性&方法,成员方法,类方法,静态方法
self加粗样式
-
self代表什么?
是当前类的实例【对象自己本身】 -
self是否为关键字?
self并不是关键字,可以使用别的变量名来代替,但是self是我们约定俗成的写法,不建议使用其他的名字。 -
self可否省略?
self不能省略,并且它必须写在参数列表中第一个位置,声明的必须的要声明,传递参数的时候不需要我们手动传参。 -
使用“self.属性名 = 属性名”将属性绑定为成员变量
类变量
定义在类中,并且定义在函数体之外的变量,我们称之为类变量【静态成员变量】
类变量通常情况不使用对象来进行调用,而是使用类名来进行调用,类变量在整个实例化对象的过程中是公用的。
类变量的调用:
类名.变量名
注意:若使用对象来进行调用也不报错,但是一般不建议这么使用。
成员变量
只作用于当前实例,定义在函数中并且绑定self
类变量与成员变量的区别:
- 定义位置不同
- 访问方式不同
类变量使用类名【使用对象访问不报错】
成员变量使用对象来访问 【使用类名来访问的时候会报错】 - 在内存出现的时机不同
类变量随着类的加载而出现,成员变量实例化对象的时候创建 - 调用的优先级不同,当使用对象来调用类变量与成员变量的时候,优先选择成员变量,若成员变量不存在,则去访问类变量
- 通过对象来更改类变量的值的时候,更改的是当前对象的值【只会影响当前对象】,通过类名来更改类变量的值的时候,更改类变量的初始值。
【会影响在类变量更改之后创建的所有对象】
动态属性&方法
-
动态数据类型语言的灵活性:创建类的实例之后,我们可以给该类的实例
绑定任意的属性以及方法。 -
在python中,我们可以使用__slots__ 变量来限制我们动态添加的属性以及方法。
-
注意:slots =() 的值为一个元组,元组中使用字符串进行声明可以动态添加
的属性以及函数的函数名。只作用于当前类的实例。class Student: __slots__ = ("name","age","eat") def __init__(self,name,age): self.name = name self.age = age #class外部的函数 def eat(): print("吃饭") if __name__ == '__main__': stu = Student("张三",20) print(stu.name) #动态绑定函数 stu.eat = eat
类中的函数/方法分为三大类
-
成员方法
一般情况下在类中定义所有的方法我们都称之为成员方法,在成员方法中,它的第一个参数
self,声明的时候必须声明在参数列表中第一个位置,使用对象来进行调用的时候,对象会
将自己作为参数自动传递给self,不需要我们手动传递。
成员方法是给对象准备的,调用的时候必须使用对象来进行调用。 -
类方法
类方法是专门给类准备的方法,它不是绑定在对象身上,而是绑定在类身上的方法,在声明类方法的时候我们通常情况下使用@classmethod装饰器来进行声明。
在类方法中,参数列表的第一个位置的参数是cls,代表类本身,使用类名来进行调用的
时候类会将自己作为参数自动传递进来,不需要手动传递。
调用类方法的时候建议使用类名来进行调用,若使用对象来进行调用也不报错,
但是会让别人造成误解。 -
静态方法
就是一类普通的方法,但是写在了类中。声明静态方法的时候使用@staticmethod
来进行声明,调用的时候建议使用类名来进行调用,若使用对象来进行调用也不报错。
简而言之:
成员方法:只能实例调用。使用到self
类方法:没有使用self @classmethod def xxx(cls)
静态方法:没有使用成员变量,也没有使用类变量(但可以使用类方法外部传参)常用于“打印说明”