囫囵吞枣学Python(1)——类
0.前言
比较潦草的笔记,重在快速学习Python。
不太适用初学编程的朋友,适用于有一门其他编程语言作为基础的朋友。
1.函数
在看Python类之前,先看看传统意义上的函数,从而与后面要学习的类形成一个对比。
这一部分很简单,直接上代码吧:
def my_add(a, b):
c = a + b
return c
print(my_add(1, 2))
结果:
3
*.面向对象编程
如果想要完全理解“类”这个概念,面向对象编程是避不开的。
与面向对象编程相对的是面向过程编程,比如刚刚的函数就是面向过程编程。面向过程编程就是把需要做的事一件一件都列出来,然后做完。
参考视频:8分钟搞懂面向对象编程 | 面向过程vs面向对象 | OOP | 封装 继承 多态_哔哩哔哩_bilibili
可以这么理解:
- 类:一个人;
- 类的属性:一个人有一个脑袋两只眼,张三李四都长这样;
- 方法:人能做的事;
- 方法的属性:做某件事时操作的某个东西;
对于封装、继承、多态,视频中讲的非常非常清晰。这里把视频里面的内容复述一遍:
- 封装:你用洗衣机的时候只用直接操作洗衣机就得了,不需要去了解”洗衣服“这个过程他是具体怎么操作的;
- 继承:小学生和大学生都是学生,张三和李四都是人;小学生和大学生能做的事(方法)可能有区别,但是他们都是学生;张三和李四能做的事也有区别,但是他们都是人;小学生和大学生这两个类都可以继承学生这个类,张三和李四都能继承人这个类;当然了,小学生和大学生也可以继承人这个类;
- 多态:小学生能做作业(方法),大学生能做作业(方法),但是做作业的内容(方法的内容)不一样;当我们把小学生和大学生都继承到学生这个类之后,再调用做作业这个方法,并不需要我们在编写程序的时候加以区分,小学生会自动做小学生的作业,大学生会自动做大学生的作业;
2.类
类的难点并不在于怎么写代码,而在于理解。如果这一部分看不懂,那就需要再看一看刚刚面向对象编程的部分。
2.1.类的属性
class Students:
def __init__(self, name, age):
self.name = name
self.age = age
student1 = Students('Jim', 18)
print(student1.name)
几点需要注意的:
- class的命名规范是
AaaBbbbbCcc
,Pascal命名风格; __init__
是前后各两个_
;self
是约定俗成的,在调用的时候并不需要写这个参数;- 对于
self.name = name
,第一个name是类的属性,第二个name是传参传进来的;
2.2.类的方法
class Students:
def __init__(self, name, age):
self.name = name
self.age = age
self.grade = 0
def set_grade(self, grade):
self.grade = grade
student1 = Students('Jim', 18)
print(student1.name)
print(student1.grade)
student1.set_grade(90)
print(student1.grade)
结果:
Jim
0
90
2.3.类的继承
这是重头戏。
class Students:
def __init__(self, name, age):
self.name = name
self.age = age
self.grade = 0
def set_grade(self, grade):
self.grade = grade
class Pupil(Students):
def __init__(self, name, age, homework):
super().__init__(name, age)
self.homework = homework
def do_homework(self):
return self.homework
class Undergraduate(Students):
def __init__(self, name, age, homework):
super().__init__(name, age)
self.homework = homework
def do_homework(self):
return self.homework
stu1 = Pupil('张三', 10, 'arithmetic')
stu2 = Undergraduate('李四', 21, 'calculus')
print(stu1.do_homework())
print(stu2.do_homework())
结果:
arithmetic
calculus
可以看到,虽然都是do_homework()
,但是结果并不同。
2.4.类的重写
上个例子中,如果把do_homework
写死为arithmetic
,并将这个方法直接定义到父类中,则在Pupil
这个子类中就不需要额外写do_homework
,而在Undergraduate
这个子类中需要把这个方法重写为calculus
。
参考视频:「Python」进阶教程 方法重写有什么用?如何实现类的方法重写?使用super访问父类_哔哩哔哩_bilibili