热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python面向对象图片_【Python进阶】实战Python面向对象基本编程

欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种

欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、Scipy、Matplotlib、Pandas的使用等等。我们的初心就是带大家更好的掌握Python这门语言,让它能为我所用。

今天是《Python进阶》专栏的第一期,在本期中,我们将主要介绍Python面向对象的基本理论、类的定义与实例化。

作者&编辑 | 汤兴旺1 Python面向对象基本理论

在解释面向对象之前,我们先了解另外一个概念,那就是面向过程。面向过程顾名思义其核心在于过程。也就是解决一个实际问题的步骤,即先干什么,再干什么。举一个我们平时洗碗的例子,如下图所示:

070286111208

从上图我们看出小明要想完成洗碗这个任务,他面对的是放水、放碗等六个步骤,他需要通过这六步才能更好的完成洗碗任务。

还是这个例子,我们看看如果是面向对象的思想会是一个怎样的过程。如下图所示:

070286111208

通过上图我们可以看出如果是面向对象的思想,小明要想完成洗碗这个任务,他只要起到一个leader的作用就行,而不是去做具体的事情。即小明面向他的儿子,小明的儿子面向自动洗碗机,而自动洗碗机具体洗碗的过程就不是小明儿子关心的事情了,更不是小明关心的事情了。在这一系列的过程中,其实都是在找这个任务可以由谁来做。

070286111208

通过上面的例子我相信你已经明白了什么是面向对象了。面向对象的核心就是对象,它实际上是对面向过程的一个封装,我们需要把自己当成一个leader来审视每一个具体的任务,找到对象,确定对象的属性和行为,负责好指挥和调度就行,而面向过程的话你就需要完成一个任务的每一个步骤,这样你会不会累死,哈哈!2 面向对象-类

2.1 基本概念

从上面的介绍,我们已经理解了什么是面向过程,什么是面向对象。那么我们应该如何在编程中使用面向对象这个思想呢?或者说如何从面向过程的编程思想过渡到面向对象编程的思想呢?具体方法如下:

(1) 列举出一个任务中具体的实现步骤,也就是面向过程中的那些步骤

(2) 分离(1)中的具体步骤并划分到某一个对象中

(3) 根据(2)中的对象及对应的行为,抽象出对应的类

(4) 设计类

上面我们提到了一个概念——类。实际上类就是某一个具体对象特征的抽象,是用来描述具有相同的属性和方法的对象的集合。为了让大家更好的理解,请看下面一个例子:

070286111208

小明是个具体的人,他的属性值和行为值各有三个,我们可以根据小明这个具体的人抽象出优质青年这个类,它是一个抽象化的概念,并不是指一个具体的人。

070286111208

我们根据这个抽象出来的类,就可以生产具体的对象。

070286111208

上面的小华、张三、李四就是一个个具体的对象。上面的整个流程如下图所示:

070286111208

由一个具体的对象抽象成一个类再实例化成一个具体的对象。

2.2 类的定义与实例化

在Python中,定义类是通过class关键字完成的,具体方法如下:

class Student(object):

pass

从上面我们可以看出class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的:

Jack = Student()

我们来print(Jack)来看下结果,如下

我们来解释下这个输出,输出里面的Student就是类,Object是对象,0x000001B1B89BA6A0这个是内存地址,也就是这个类Student实例化后的对象在内存中地址为0x000001B1B89BA6A0。

为什么print(Jack)后的结果是那样的呢?我们来看下整个流程:

070286111208

实际上就是通过这个变量找到对象,然后根据对象里面的__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"

batch_size = 64

num_classes = 2

image_size = (48,48)

class ImageData:

def read_txt_file(self):

self.img_paths = []

self.labels = []

for line in open(self.txt_file, 'r'):

items = line.split(' ')

self.img_paths.append(items[0])

self.labels.append(int(items[1]))

def __init__(self, txt_file, batch_size, num_classes,

image_size, buffer_scale=100):

self.image_size = image_size

self.batch_size = batch_size

self.txt_file = txt_file

self.num_classes = num_classes

buffer_size = batch_size * buffer_scale

# 读取图片

self.read_txt_file()

self.dataset_size = len(self.labels)

print("num of train datas=", self.dataset_size)

# 转换成Tensor

self.img_paths = tf.convert_to_tensor(self.img_paths, dtype=tf.string)

self.labels = tf.convert_to_tensor(self.labels, dtype=tf.int32)

# 创建数据集

data = tf.data.Dataset.from_tensor_slices((self.img_paths, self.labels))

print("data type=", type(data))

data = data.map(self.parse_function)

data = data.repeat(1000)

data = data.shuffle(buffer_size=buffer_size)

# 设置self data Batch

self.data = data.batch(batch_size)

print("self.data type=", type(self.data))

def augment_dataset(self, image, size):

distorted_image = tf.image.random_brightness(image,

max_delta=63)

distorted_image = tf.image.random_contrast(distorted_image,

lower=0.2, upper=1.8)

float_image = tf.image.per_image_standardization(distorted_image)

return float_image

def parse_function(self, filename, label):

label_ = tf.one_hot(label, self.num_classes)

img = tf.io.read_file(filename)

img = tf.image.decode_jpeg(img, channels=3)

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 = tf.image.random_flip_left_right(img)

img = self.augment_dataset(img, self.image_size)

return img, label_

dataset = ImageData(txtfile, batch_size, num_classes, image_size)

在上面的例子中我们定义了一个ImageData类,类中定义了四个方法分别是__init__()方法、read_txt_file()方法、parse_function()方法和augment_dataset()方法。我们首先来解释下__init__方法,其实际上可以理解为一个初始化方法,也就是在创建一个对象时会默认被调用,不需要手动调用。但是其他的方法必须要手动的调用,如上面代码黑色加粗部分。

为了加深对__init__()方法的理解,我们再来看一个简单的例子,如下:

class AiLearning():

def __init__(self):

self.a = "yousanai"

d = AiLearning()

print(d.a)

上面的输出很简单就是yousanai。那如果不是__init__方法,结果会怎样呢?

class Ai_Learning():

def Learning(self):

self.a = "yousanai"

d = Ai_Learning()

print(d.a)

这个输出程序会报错,会显示AttributeError: 'Ai_Learning' object has no attribute 'a'。即没有属性a。我们需要将代码改成下面的代码,才能正确输出,我们所做的改动就是手动调用了Learning()方法。

class Ai_Learning():

def Learning(self):

self.a = "yousanai"

return self.a

d = Ai_Learning()

print(d.Learning())

我相信通过上面的讲解你已经明白了如何来设计一个类了。总结

本期我们介绍了Python面向对象的思想及其基本概念,也介绍了如何定义一个类、创建一个对象和设计一个类,并介绍了创建对象时的底层运作机制。希望您能更好的掌握面向对象的思想。

下期预告:Python文件操作

如果想加入我们,后台留言吧

转载文章请后台联系

侵权必究

技术交流请移步知识星球

更多请关注知乎专栏《有三AI学院》和公众号《有三AI》



推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
author-avatar
手机用户2502880237
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有