类是一个函数包
类中可以放置函数和变量,然后类中的函数可以很方便的使用类中的变量。
类中可以放置函数和变量
def语句定义一个函数,class语句定义一个类。
在类中被定义的函数被称为类的【方法】,描述的是这个类能做什么。使用类名.函数名()的格式,就可以让类的方法运行起来。
在类中被定义的变量被称为类的【属性】。使用类名.变量名的格式,可以把类中的属性的值提取出来。
使用类名.变量名的格式,可以让我们在类的外面,增加或修改类的属性。
为了让代码更直观,一般会把类中的函数和函数之间换行隔开。
@classmethod是声明了下面的函数是类方法。
类方法和类属性可以组合
为了把类中的变量传递给类中的函数,我们需要用到3个特定格式:
① 第一个格式@classmethod的中文意思就是“类方法”,@classmethod声明了函数1是类方法,这样才能允许函数1使用类属性中的数据。
② 第二个格式cls的意思是class的缩写。如果类方法函数1想使用类属性(也就是类中的变量),就要写上cls为函数1的第一个参数,也就是把这个类作为参数传给自己,这样就能被允许使用类中的数据。
③ 第三个格式是cls.变量。类方法想使用类属性的时候,需要在这些变量名称前加上cls.。
注意:当类中的函数【不需要】用到类中的变量时,就不要用@classmethod、cls、cls.三处格式,否则终端会报错。
给类方法传参
类方法仅使用外部参数
只使用外部的参数,没有使用类属性,格式上不需要@lassmethod和cls。
类方法仅使用内部参数
就是要用上面说的类方法可以与类属性组合的三个格式
类方法同时使用内部参数和外部参数
# 请直接运行并体验代码效果 class 加100类(): 变量 = 100 @classmethod def 加100函数(cls,参数): 总和 = cls.变量 + 参数 print('加100函数计算结果如下:') print(总和) 参数 = int(input('请输入一个整数:')) 加100类.加100函数(参数)
效果图
注意:我们要多预设几个参数位置,以备类方法突然要使用多个外部参数。
增加/修改类属性
有两种途径来增加或修改类属性。一种是从内部,用类方法去增加/修改;另一种是从外部,用类.变量 = xx直接增加/修改类属性。
外部增加/修改类属性
class 类A(): pass 类A.变量1 = 100 print(类A.变量1)
内部增加/修改类属性
lass 类(): @classmethod def 增加类属性(cls): cls.变量 = input('请随意输入字符串:') 类.增加类属性() print('打印新增的类属性:') print(类.变量)
类与对象
以【类】为模板做出来的这些产品就是【类】的【实例化对象】,这个过程叫做【实例化】
类的实例化
实例化前的格式
实例化后的格式
实例属性和类属性
增加/修改类属性实例属性也会发生变化,但是增加/修改实例属性,类属性不会发生变化, 且影响的实例属性只有那一个。
注意:当修改了实例属性之后,修改对应的类属性也不会影响该实例属性了。
实例方法和类方法
重写类方法
步骤一:在类的外部写一个函数。
步骤二:把这个新函数的名字赋值给类.原始函数
注意:不可以重写实例方法。
初始化函数
class 类(): def __init__(self): print('实例化成功!') 实例 = 类()
效果图
初始化函数的意思是,当你创建一个实例的时候,这个函数就会被调用。上面的代码在执行实例 = 类()的语句时,就自动调用了__init__(self)函数。
__init__()的括号中,第一个参数一定要写上self,不然会报错。
初始化函数也可以传递参数。
类的继承
数据流转图
注意:子类的方法可以替换父类的方法(也就是重新定义)
多重继承:一个子类从【多个父类】中继承类方法。格式是class 子类(父类1,父类2,……)。