1.什么是类?
【类】是一个函数包。类中可以放置函数和变量,然后类中的函数可以很方便的使用类中的变量。
①定义 类
就想我们用def语句来定义函数一样,我们用class来定义一个类。如:
# 语法:创建一个名为“ClassName”的类,类名一般首字母要大写,(): 不能丢 class ClassName(): # 定义一个变量 num = 100 # 如定义一个名为'狗'的类,可以写成class Dog(): # 规范:class语句后续的代码块要缩进 def function1(): # 定义类中的函数1
②方法和属性
【方法】在类中定义的函数,调用格式:类.函数()
【属性】在类中定义的变量,调用格式:类.变量
2.类方法和类属性的组合使用
①将类中的变量传给类中的函数
为了把类中的变量传递给类中的函数,我们需要用到3个特定格式:
【1】第一个格式@classmethod的中文意思就是“类方法”,@classmethod声明了函数1是类方法,这样才能允许函数1使用类属性中的数据。
【2】第二个格式cls的意思是class的缩写。如果类方法函数1想使用类属性(也就是类中的变量),就要写上cls为函数1的第一个参数,也就是把这个类作为参数传给自己,这样就能被允许使用类中的数据。
【3】第三个格式是cls.变量。类方法想使用类属性的时候,需要在这些变量名称前加上cls.。
这就好比类方法和类之间的约法三章,所以但凡有任何格式错误都会报错。
另外,当类中的函数【不需要】用到类中的变量时,就不要用@classmethod、cls、cls.三处格式,否则就是占着茅坑不拉屎,终端也会给你报错。(没错,就是这么傲娇~)以下是正确的示例:
class 类A(): 变量1 = 100 变量2 = 200 def 函数1(): # 【不需要】使用类属性 print('我不需要使用类属性。') @classmethod def 函数2(cls): # 【需要】使用类属性 print(cls.变量1) print(cls.变量2) 类A.函数1() 类A.函数2()
3.给类方法传参
①类方法使用外部参数
一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。'] class 念诗类(): def 念诗函数(参数): for i in 参数: print(i) 念诗类.念诗函数(一首诗)
②类方法使用内部参数
class 念诗类(): 一首诗 = ['《卜算子》', '我住长江头,', '君住长江尾。', '日日思君不见君,', '共饮长江水。'] @classmethod def 念诗函数(cls): for i in cls.一首诗: print(i) 念诗类.念诗函数()
③类方法同时使用内部参数和外部参数
class 念诗类(): 一首诗 = ['《卜算子》', '我住长江头,', '君住长江尾。', '日日思君不见君,', '共饮长江水。'] @classmethod def 念诗函数(cls,参数): print('念给%s的诗:'%参数) for i in cls.一首诗: print(i) 念诗类.念诗函数('张三')
4.增加/修改类属性
有两种途径来增加或修改类属性。一种是从外部:用类.变量 = xx直接增加/修改类属性;一种是从内部:用类方法去增加/修改;
①从外部增加/修改类属性
示例一:
变量1 = 15 #这是类外部的变量1 变量2 = 'abc' class 类A(): 变量1 = 100 #这是类属性变量1 变量1 = 类A.变量1 类A.变量2 = 变量2 #从外部增加/修改类属性 print(类A.变量1) print(类A.变量2)
示例一运行结果:依次打印出100和abc
我们要区分两个变量,虽然名字相同,但是类外部的【变量1】和类属性【变量1】是两个不同的变量。变量1 = 类A.变量1是把类属性100重新赋值给了类外部的变量1,类属性变量1的值没有改变,还是100。
而类A.变量2 = 变量2,是为类A增加了一个类属性变量2,它的值等于外部的变量2也就是abc。
示例二:
class 类(): @classmethod def 打印类属性(cls): print(cls.变量) 类.变量 = input('请输入字符串:') #从外部增加/修改类属性 类.打印类属性()
这段代码先利用input函数从外部接收了一个字符串,并通过赋值的方式保存为了类属性类.变量。然后利用类方法类.打印类属性()打印出了这个外部输入的字符串。
②从内部增加/修改类属性
class 念诗类(): 一首诗 = ['《卜算子》', '我住长江头,', '君住长江尾。', '日日思君不见君,', '共饮长江水。'] @classmethod def 念诗函数(cls): cls.接收人 = input('请输入你想给谁念诗:') #从内部增加/修改类属性 print('念给' + cls.接收人 + '的诗:') for i in cls.一首诗: print(i) 念诗类.念诗函数()
5.完整项目示例:
class 成绩单(): @classmethod def 录入成绩单(cls): cls.学生姓名 = input('请输入学生姓名:') cls.语文_成绩 = int(input('请输入语文成绩:')) cls.数学_成绩 = int(input('请输入数学成绩:')) @classmethod def 打印成绩单(cls): print(cls.学生姓名 + '的成绩单如下:') print('语文成绩:'+ str(cls.语文_成绩)) print('数学成绩:'+ str(cls.数学_成绩)) @classmethod def 打印平均分(cls): 平均分 = (cls.语文_成绩 + cls.数学_成绩)/2 print(cls.学生姓名 + '的平均分是:' + str(平均分)) @classmethod def 评级(cls): 平均分 = (cls.语文_成绩 + cls.数学_成绩)/2 if 平均分>=90: print(cls.学生姓名 + '的评级是:优') elif 平均分>= 80 and 平均分<90 : print(cls.学生姓名 + '的评级是:良') elif 平均分>= 60 and 平均分<80 : print(cls.学生姓名 + '的评级是:中') else: print(cls.学生姓名 + '的评级是:差') 成绩单.录入成绩单() 成绩单.打印成绩单() 成绩单.打印平均分() 成绩单.评级()
如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省!