欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、Scipy、Matplotlib、Pandas的使用等等。我们的初心就是带大家更好的掌握Python这门语言,让它能为我所用。
今天是《Python进阶》专栏的第一期,在本期中,我们将主要介绍Python面向对象的基本理论、类的定义与实例化。
作者&编辑 | 汤兴旺
1 Python面向对象基本理论
在解释面向对象之前,我们先了解另外一个概念,那就是面向过程。面向过程顾名思义其核心在于过程。也就是解决一个实际问题的步骤,即先干什么,再干什么。举一个我们平时洗碗的例子,如下图所示:
从上图我们看出小明要想完成洗碗这个任务,他面对的是放水、放碗等六个步骤,他需要通过这六步才能更好的完成洗碗任务。
还是这个例子,我们看看如果是面向对象的思想会是一个怎样的过程。如下图所示:
通过上图我们可以看出如果是面向对象的思想,小明要想完成洗碗这个任务,他只要起到一个leader的作用就行,而不是去做具体的事情。即小明面向他的儿子,小明的儿子面向自动洗碗机,而自动洗碗机具体洗碗的过程就不是小明儿子关心的事情了,更不是小明关心的事情了。在这一系列的过程中,其实都是在找这个任务可以由谁来做。
通过上面的例子我相信你已经明白了什么是面向对象了。面向对象的核心就是对象,它实际上是对面向过程的一个封装,我们需要把自己当成一个leader来审视每一个具体的任务,找到对象,确定对象的属性和行为,负责好指挥和调度就行,而面向过程的话你就需要完成一个任务的每一个步骤,这样你会不会累死,哈哈!
2 面向对象-类
2.1 基本概念
从上面的介绍,我们已经理解了什么是面向过程,什么是面向对象。那么我们应该如何在编程中使用面向对象这个思想呢?或者说如何从面向过程的编程思想过渡到面向对象编程的思想呢?具体方法如下:
(1) 列举出一个任务中具体的实现步骤,也就是面向过程中的那些步骤
(2) 分离(1)中的具体步骤并划分到某一个对象中
(3) 根据(2)中的对象及对应的行为,抽象出对应的类
(4) 设计类
上面我们提到了一个概念——类。实际上类就是某一个具体对象特征的抽象,是用来描述具有相同的属性和方法的对象的集合。为了让大家更好的理解,请看下面一个例子:
小明是个具体的人,他的属性值和行为值各有三个,我们可以根据小明这个具体的人抽象出优质青年这个类,它是一个抽象化的概念,并不是指一个具体的人。
我们根据这个抽象出来的类,就可以生产具体的对象。
上面的小华、张三、李四就是一个个具体的对象。上面的整个流程如下图所示:
由一个具体的对象抽象成一个类再实例化成一个具体的对象。
2.2 类的定义与实例化
在Python中,定义类是通过class关键字完成的,具体方法如下:
class Student(object):
pass
从上面我们可以看出class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的:
Jack = Student()
我们来print(Jack)来看下结果,如下
<__main__.Student object at 0x000001B1B89BA6A0>
我们来解释下这个输出,输出里面的Student就是类,Object是对象,0x000001B1B89BA6A0这个是内存地址,也就是这个类Student实例化后的对象在内存中地址为0x000001B1B89BA6A0。
为什么print(Jack)后的结果是那样的呢?我们来看下整个流程:
实际上就是通过这个变量找到对象,然后根据对象里面的__class__值找到对应的一个类。我们可以看下Jack的__class__属性值来验证下,只需要print(Jack.__class__)即可,输出如下:
不知道你是否明白了创建对象时的底层运作,欢迎交流!
2.3 类的设计
上面我们讲解了如何定义一个类及类的实例化,现在我们讲解如何设计一个类。就以利用TensorFlow2.0对图片数据进行预处理的一个方法来讲解。具体代码如下:
import tensorflow as tf
txtfile=r"D://Learning//tensorflow_2.0//smile//datas//train//train.txt"
def read_txt_file(self):def __init__(self, txt_file, batch_size, num_classes,
image_size, buffer_scale=100):self.read_txt_file()
# 转换成Tensor
self.img_paths = tf.convert_to_tensor(self.img_paths, dtype=tf.string)def augment_dataset(self, image, size): def parse_function(self, filename, label):
img = tf.io.read_file(filename)
img = tf.image.convert_image_dtype(img, dtype=tf.float32)
img=tf.image.random_crop(img, [self.image_size[0], self.image_size[1], 3])img = self.augment_dataset(img, self.image_size)
在上面的例子中我们定义了一个ImageData类,类中定义了四个方法分别是__init__()方法、read_txt_file()方法、parse_function()方法和augment_dataset()方法。我们首先来解释下__init__方法,其实际上可以理解为一个初始化方法,也就是在创建一个对象时会默认被调用,不需要手动调用。但是其他的方法必须要手动的调用,如上面代码黑色加粗部分。
为了加深对__init__()方法的理解,我们再来看一个简单的例子,如下:
class AiLearning():
上面的输出很简单就是yousanai。那如果不是__init__方法,结果会怎样呢?
class Ai_Learning():
这个输出程序会报错,会显示AttributeError: 'Ai_Learning' object has no attribute 'a'。即没有属性a。我们需要将代码改成下面的代码,才能正确输出,我们所做的改动就是手动调用了Learning()方法。
class Ai_Learning():
我相信通过上面的讲解你已经明白了如何来设计一个类了。
总结
本期我们介绍了Python面向对象的思想及其基本概念,也介绍了如何定义一个类、创建一个对象和设计一个类,并介绍了创建对象时的底层运作机制。希望您能更好的掌握面向对象的思想。
下期预告:Python文件操作
有三AI编程微信公众号《三人行ToCode》
有三AI编程方面的微信公众号《三人行ToCode》创建了,欢迎加入,希望大家能借助这个平台,扎实自己的编程基础。
转载文章请后台联系
侵权必究
往期精选
【Python进阶】Python进阶专栏、编程与开源框架知识星球上线,等你来follow
【杂谈】菜鸟误入linux会有哪些惨痛的经历
【TensorFlow2.0】TensorFlow2.0专栏上线,你来吗?
【TensorFlow2.0】以后我们再也离不开Keras了?
【TensorFlow2.0】数据读取与使用方式
【TensorFlow2.0】如何搭建网络模型