类:
理解类最简单的方式:类是一个函数包,类中可以放置变量和函数,然后类中的函数可以很方便的调用变量。
使用class来定义一个类
# 语法:创建一个名为“ClassName”的类,类名一般首字母要大写,(): 不能丢
class ClassName():
# 如定义一个名为'狗'的类,可以写成class Dog():
# 规范:class语句后续的代码块要缩进
def function1():
# 定义类中的函数1
在类中被定义的函数被称为类的【方法】,描述的是这个类能做什么。我们使用
类名.函数名()
的格式,就可以让类的方法运行起来
除了函数外,在类中还可以放置一堆变量,就像这样:
class 类A():
变量1 = 100
变量2 = -5.83
变量3 = 'abc'
在类中被定义的变量被称为类的【属性】。使用
类名.变量名
的格式,可以把类中的属性的值提取出来
不过类中的属性(变量)也不是不能改变,使用
类名.变量名
的格式,可以让我们在类的外面,增加或修改类的属性
class 类A():
变量1 = 100
变量2 = -5.83
变量3 = 'abc'
类A.变量1 = 99
类A.变量4 = '新增一个变量'
print(类A.变量1)
print(类A.变量4)
看到这里,你可能会有有点疑惑,类方法也是函数,那和我们之前学的单独定义函数有什么区别吗?
它们两者最大的区别,一个是它的调用格式:
类.函数名()
比
函数名()
多了一个【类.】,但更重要的是,“类”中的函数可以利用“类”中的变量(也就是类方法可以调用类属性)。
① 第一个格式
@classmethod
的中文意思就是“类方法”,
@classmethod
声明了
函数1
是类方法,这样才能允许
函数1
使用类属性中的数据。
② 第二个格式
cls
的意思是
class
的缩写。如果类方法
函数1
想使用类属性(也就是类中的变量),就要写上
cls
为
函数1
的第一个参数,也就是把这个类作为参数传给自己,这样就能被允许使用类中的数据。
③ 第三个格式是
cls.变量
。类方法想使用类属性的时候,需要在这些变量名称前加上
cls.
。
这就好比
类方法
和
类
之间的约法三章,所以但凡有任何格式错误都会报错。
类与对象
类是对象的模板
类的实例化:
直接使用类:
实例化后使用类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 直接使用类 class 成绩单(): @classmethod def 录入成绩单(cls): cls.学生姓名 = input('请输入学生姓名:') cls.语文_成绩 = int(input('请输入语文成绩:')) cls.数学_成绩 = int(input('请输入数学成绩:')) @classmethod def 打印成绩单(cls): print(cls.学生姓名 + '的成绩单如下:') print('语文成绩:'+ str(cls.语文_成绩)) print('数学成绩:'+ str(cls.数学_成绩)) 成绩单.录入成绩单() 成绩单.打印成绩单() # 实例化之后 class 成绩单(): # ①不用再写@classmethod def 录入成绩单(self): # ②cls变成self self.学生姓名 = input('请输入学生姓名:') # ③cls.变成self. self.语文_成绩 = int(input('请输入语文成绩:')) self.数学_成绩 = int(input('请输入数学成绩:')) def 打印成绩单(self): print(self.学生姓名 + '的成绩单如下:') print('语文成绩:'+ str(self.语文_成绩)) print('数学成绩:'+ str(self.数学_成绩)) 成绩单1 = 成绩单() # ④创建实例对象:成绩单1 成绩单1.录入成绩单() # ⑤实例化后使用 成绩单1.打印成绩单()
当我们完成实例化后,对应于一个实例的属性和方法,叫“实例属性、实例方法”,不再称为“类属性、类方法”:
类和实例的关系,就像母体和复制品的关系一样。当一个类实例化为多个实例后,实例将原封不动的获得类属性,也就是
实例属性
和
类属性
完全相等。
我们可以修改类属性,这会导致所有实例属性变化(因为类是模板)
我们也可以修改实例属性,但这不会影响到其他实例,也不会影响到类。因为
每个实例都是独立的个体
新增也是一样的道理,在类中新增属性会影响到实例,但在实例中新增属性只影响这个实例自己
和类属性一样,我们可以重写类方法,这会导致所有实例方法自动被重写
“重写类方法”分成两个步骤:第一个步骤是在类的外部写一个函数,第二个步骤是把这个新函数的名字赋值给
类.原始函数
要注意的是,这里的赋值是在替换方法,并不是调用函数,所以【不要加上括号】—— 写成
类.原始函数() = 新函数()
是错误的。
我们可以通过重写类方法,让实例方法发生变化,但我们不能重写实例方法,模板给的技能不是说换就能换的。
初始化函数:
初始化函数
的意思是,当你创建一个实例的时候,这个函数就会被调用。上面的代码在执行
实例 = 类()
的语句时,就自动调用了
__init__(self)
函数。
初始化函数
的写法是固定的格式:中间是“init”,这个单词的中文意思是“初始化”,然后前后都要有【两个下划线】,然后
__init__()
的括号中,第一个参数一定要写上
self
,不然会报错。
class 成绩单(): def __init__(self,学生姓名,语文_成绩,数学_成绩): self.学生姓名 = 学生姓名 self.语文_成绩 = 语文_成绩 self.数学_成绩 = 数学_成绩 def 打印成绩单(self): print(self.学生姓名 + '的成绩单如下:') print('语文成绩:'+ str(self.语文_成绩)) print('数学成绩:'+ str(self.数学_成绩)) 成绩单1 = 成绩单('张三',99,88) 成绩单2 = 成绩单('李四',64,73) 成绩单3 = 成绩单('王五',33,22) 成绩单1.打印成绩单() 成绩单2.打印成绩单() 成绩单3.打印成绩单()
继承