Python_面向对象初步_类_属性_方法_综合案例(10)

目录:

一、面向对象介绍
二、类和对象
三、实例属性和方法
四、构造方法
五、对象的打印和开发
六、案例练习说明

创作不易,各位看官,点个赞收藏、关注必回关、QAQ、您的点赞是我更新的最大动力!


一、面向对象介绍

(一)什么是面向对象

面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)的主要思想是 把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了 描叙一个事物在整个解决问题的步骤中的行为

(二)面向过程和面向对象

面向过程和面向对象都是软件开发行业中的编程思想,在软件开发历程中都扮演了非常 重要的角色,面向过程编程思想最直观的实现方式就是函数式编程,面向对象的最直观的实 现方式是类和对象
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使 用的时候一个一个依次调用就可以解决问题。面向对象是把构成问题的事物分解成各个对象, 通过对象的行为之间的互相关联解决问题,同时抽取的对象本身都是独立的,可以扩展出更 多的实现。面向过程和面向对象最直观的理解如下图所示:

在这里插入图片描述
(三)面向对象的优势

面向对象和面向过程不同的是,将构成问题的各个事物抽象出来作为单独的对象,此时 每个对象的行为就不再局限于解决固定问题的某个步骤了,而是可以让对象的行为适用于任 何一个可以起到作用的地方,这样做的结果就是软件的功能得到了非常好的扩展

返回文章目录

二、类和对象

(一)术语解释

  • 面向对象程序设计(Object Oriented Programming)中的概念主要包括:对象、类、属性、 方法、封装、继承、多态、消息传递。通过这些概念面向对象的思想得到了具体的体现

1、对象(object)
生活中有一句话,万物皆对象,对象就是生活中客观存在的实际物体,也被称为实体,实体
对象,实例,实例对象。
2、类(class)
类其实就是类型的简称,描述的是不同的数据类型,生活中还是那句话:万物皆对象,各种
事物分门别类,描述生活中的不同类型的事物,就是类
3、属性(Attribute)
生活中的实体物体,都是包含自己的特征的,如人包含姓名、性别、年龄、肤色特征(名词),
电脑包含颜色、尺寸、CPU、内存特征,课程包含名称,时长,周期特征。
属性就是对象的特征(名词)。
4、方法(Method)
生活中的实体物体,都是包含具体的行为的,如人包含吃饭睡觉打豆豆…行为,电脑包含开 机、关机、播放、游戏、办公行为,课程包含信息传播行为。
方法就是对象的行为(动词)。
5、其它(other)
面向对象中还会涉及到封装、继承、多态、数据绑定、消息通信等等,具体的概念和应 用都会在后续的章节中进行详细解读

(二)类型声明

类和对象是计算机编程语言中的用于描述事物的载体。它们的关系是,对象是类的实例, 类是对象的模板。如下图所示:
在这里插入图片描述
(三)类型声明

类型声明是面向对象程序设计开发的第一个环节,本节内容通过基本语法、命名规范先 了解类型的基本建模方式,再分析在项目案例中怎么分析和构建符合需求的类型

1、基本语法
Python 编程语言的语法提供了 class 关键字,用于类型的声明,基本语法如下:
在这里插入图片描述
2、声明规范
Python 编程语言相比较其他编程语言,为了简化编码制定了更加严格的语法规则,并 且在软件开发过程中通过开发规范进行约束

① 类型名称:标识符(字母、数字、下划线组成,数字不能开头)
帕斯卡命名法(大驼峰命名法):一个或者多个单词组成,每个单词首字母大写
② 属性特征:就是一个变量,必须和 self 一起使用;
遵循变量的命名规则[见名知意、下划线命名法]
③ 方法行为:就是一个函数,遵循函数的命名规则[见名知意、下划线命名法]


  • 类型命名规范
    类型名称是一种标识符,由英文字母、数字和下划线组成,数字不能开头。项目开发规 范要求类型名称要做到见名知意,使用帕斯卡命名法
帕斯卡命名法,某些资料中也称为大驼峰命名法,是由一个或者多个单词组成,每个大 单词的首字母大写,如:UserInformation、Consumer,Goods 等等
  • 属性名称规范
    属性,本质上就是一个普通的变量,声明在类型中用于描述类型的一个特征数据,所以 属性名称的规范和变量的命名规范一致,做到见名知意,优先推荐下划线命名法,或者使用 驼峰命名法
驼峰命名法,某些资料中也称为小驼峰命名法,是由一个或者多个单词组成,第一个单 词全部小写,后面每个大单词的首字母大写,如:userGender、userType 等等
  • 方法名称规范
方法,本质上就是在类型中声明的函数(类型赋予了方法更多的功能),所以方法名称的 命名规范和函数的命名规范一致,做到见名知意,优先推荐下划线命名法,或者使用驼峰命 名法
  • 其它规范
类型在标准开发规范的约束下,要求在类型声明内部第一行必须包含文档注释,描述类 型的作用,在类型内部先声明属性,再声明方法,不同的方法之间分隔一个空行
  • 类型的声明案例
下面的代码中,声明了一个普通的用户类型,类型包含账号、密码、昵称属性,包含保 存、删除的方法
class User:
    """用户类型"""
    def __init__(self,username,password,nickname):
        """记录用户属性"""
        print("开始执行对象初始化")
        self.username = username
        self.password = password
        self.nickname = nickname

    def save(self):
        """保存方法"""
        pass

    def delete(self):
        """删除方法"""
        print("执行删除操作")

(四)面向对象设计开发

面向对象程序设计开发,是一种成熟的程序设计开发方式,有固定的开发步骤,通常包 含如下四个环节:

面向对象分析(OOA:Object-Oriented Analysis) 从用户需求出发,分析项目中需要解决的问题,抽象项目中的功能和互相依赖 的关系,确定功能开发过程中的限制条件
面向对象设计(OOD:Object-Oriented Design) 根据分析得到的具体的问题,抽取参与解决问题的对象
面向对象编程(OOP:Object-Oriented Programming)
编程对象测试(OOT:Object-Oriented Testing)

软件从开发到交付的完整示意流程,如下图所示:
在这里插入图片描述
1、项目分析
以个人博客项目为例进行面向对象的分析及开发,个人博客是以信息共享和社交 为目的经典软件产品,首先针对个人博客的功能进行分解,如图所示:
在这里插入图片描述
项目中需要的功能,就是我们需要解决的问题,根据面向对象的设计原则,简要分析实 现上述功能需要参与的对象,如图所示:
在这里插入图片描述
2、声明类型
根据项目分析,我们需要创建项目中需要的类型,首先创建项目并构建项目结构,项目 名称为:blog,项目中定义类型的模块为:model.py,初始项目结构如下图所示:
在这里插入图片描述

返回文章目录

三、实例属性和方法

类型作为一种事物的描述,需要同时描述事物的特征和他们所具备的行为,描述特征数 据的就是实例属性,描述行为的就是实例方法,如下图所示超级英雄类型中,就可以抽取所 有超级英雄共有的特征和行为,并将这些特征和行为声明在超级英雄类型中表现出来

(一)基本语法

实例属性,是类型中用于描述每个对象具体数据的,在类型声明过程中,将实例属性声 明在__init__()方法中,通过接受传递的参数数据进行数据初始化,基本语法如下:

class User:
    """用户类型"""
    def __init__(self,username,password,nickname):
        """记录用户属性"""
        print("开始执行对象初始化")
        self.username = username
        self.password = password
        self.nickname = nickname

实例方法,是类型中描述每个对象的行为操作的,通过函数语法进行体现,将对象的行 为函数声明在类型的内部,称为类型的实例方法,基本语法如下:

class User:
    """用户类型"""
    def __init__(self,username,password,nickname):
        """记录用户属性"""
        print("开始执行对象初始化")
        self.username = username
        self.password = password
        self.nickname = nickname

    def save(self):
        """保存方法"""
        pass

    def delete(self):
        """删除方法"""
        print("执行删除操作")

(二)self关键字

类型中的方法,第一个参数都是 self,self 关键字用于描述当前对象自身,类似生活中” 我”这个名词一样,通过 self 可以在实例方法中获取到当前对象自身的所有实例属性和实例 方法
在这里插入图片描述

self 关键字主要用于描述当前对象,声明在方法的第一个位置参数上,是一个变量,所以可 以修改成任意单词来表示,但是约定俗称使用 self 这个单词

(三)实例操作

个人博客项目中,我们已经根据功能涉及的对象抽取了作者类型和文章类型,根据我们 在项目中的操作方式,就可以为所有的作者声明他们共有的属性和方法了,文章亦如此
在这里插入图片描述
根据分析得到的结果,按照类型声明的语法,完善作者类型的实例属性和实例方法,操 作代码如下:

在这里插入图片描述
返回文章目录

四、构造方法

面向对象程序设计开发中,对象是具体包含处理数据的实体,通过类型创建对象并使用 对象的实例属性和实例方法,是开发必须掌握的一个环节

(一)创建对象语法

通过声明的类型,可以创建该类型对应的具体对象,基本语法如下:
在这里插入图片描述
创建对象时就可以将数据通过参数传递给__init__()方法完成属性的初始化,并 将创建好的对象的地址存储在 user 变量中,通过 user 变量可以找到或者引用到创建的对象, 所以称 user 变量为对象的引用变量

(二)对象属性和方法

创建对象是为了使用对象的属性和方法,在语法中可以通过对象的引用变量来获取对象 并操作对象的属性和方法
1、对象的实例属性

在这里插入图片描述

2、对象的实例方法

在这里插入图片描述

(三)、对象的创建过程

程序都是运行在计算机内存中的,对象的创建也是在程序申请的内存空间中完成的,在 对象构建过程中,主要经历了申请空间、创建对象、属性初始化的过程
运行程序,就可以看到在创建对象时,解释器自动调用了__new__(cls)创建对象,调用 init(self)初始化数据的过程
通过代码进行演示,可以看到解释器构建对象的过程:

# - 申请空间-->创建对象-->属性初始化
# 
# - 类名(),准备创建对象,申请内存空间-->调用`__new__`()方法,创建对象-->
# 调用`__init__`()方法,对象初始化-->将创建好的对象赋值给"="左边的变量

class User:
    """用户类型"""
    def __init__(self,username):
        """记录用户属性"""
        print("对象初始化操作")
        self.username = username
    def __new__(cls, *args, **kwargs):
        """创建对象"""
        print("开始创建对象")
        return object.__new__(cls)
user = User("稳稳")

返回文章目录

五、对象的打印和开发

(一)对象的打印

通过对象的创建过程了解到,对象一旦创建完成,是将对象在内存中的地址临时存储在 引用变量中的,这样通过引用变量才能访问到对象,所以在程序中直接打印可以找到对象的 引用变量时,就会得到引用变量中存储的内存地址数据

class User:
    """用户类型"""
    def __init__(self,username,password,nickname):
        """记录用户属性"""
        self.username = username
        self.password = password
        self.nickname = nickname

    def save(self):
        """保存方法"""
        pass

    def delete(self):
        """删除方法"""
        print("执行删除操作")
# 创建user对象,会自动执行__init__()方法
user = User("稳稳","123","C9")
print(user)
print(id(user))

在这里插入图片描述
(二)str()和repr()

项目中直接访问对象,就会获取到对象的内存地址,对于项目的开发人员来说,更多的 时候关注的是对象本身的数据,打印对象直接获取对象内部关键数据是一种非常直观并且非

1、str()

#可以通过 对象名.属性名 查看属性值,但是当属性比较多时,查看属性就不太方便
#打印对象时,会自动调用__str__()方法
class User:
    """用户类型"""
    def __init__(self,username,password,nickname):
        """记录用户属性"""
        self.username = username
        self.password = password
        self.nickname = nickname
    def __str__(self):
        print("--str--")
        # return "123"
        return f"{self.username} {self.password} {self.nickname}"
user = User("稳稳","123","C9")
#打印对象会自动执行__str__()方法
print(user)
print([user])

在这里插入图片描述
2、repr()

class User:
    """用户类型"""
    def __init__(self,username,password,nickname):
        """记录用户属性"""
        self.username = username
        self.password = password
        self.nickname = nickname
    # def __str__(self):
    #     print("--str--")
    #     return f"{self.username} {self.password} {self.nickname}"

    def __repr__(self):
        print("--repr--")
        return f"{self.username} {self.password} {self.nickname}"
user = User("稳稳","123","C9")
#打印对象会自动执行__str__()方法,如果没有此方法,会寻找__repr__()方法
print(user)
print([user])

在这里插入图片描述

class Student:
    """学生类"""
    def __init__(self,name,age):
        """初始化属性"""
        self.name = name  #stu1.name="稳稳"
        self.age = age

    def __str__(self):
        """自我介绍的方法"""
        return (f"我叫{self.name},今年{self.age}岁,请多多关照!")

stu1 = Student("稳稳",20)
print(stu1)

返回文章目录

六、案例练习说明

1、老张开车去东北[函数式]

# 老张开车去东北
#
# ```
# 需求:发动车辆,输入姓名,车型,到达的目的地(面向过程)
# 定义车辆发动函数,驾驶函数,到达目的地函数
# ```
import time


def start():
    """驾驶员"""
    name = input("请输入姓名:")
    print("用户:",name)
    #调用车辆驾驶函数
    driver(name)

def driver(name):
    """驾驶"""
    car = input("请输入车的型号")
    print(f"{name}驾驶{car},准备出发。。。")
    area = input("请输入要到达的目的地")
    #调用到达目的地函数
    run(area)

def run(area):
    """车行驶到达目的地"""
    for i in range(10):
        time.sleep(0.5)
        print("->",end='')
    print("经过跋山涉水,到达目的地",area)
# start()

2、老张开车去东北[面向对象]

# 面向对象开车
# 老张开车去东北
# """
# 人类
#     属性:姓名,年龄,性别
#     方法:开车 (传递一个车对象,直接调用车行驶的方法,不需要关系车是如何行驶的)
# 车类
#     属性:品牌,颜色
#     方法:行驶
# 地点类
#     属性:省市县
# """
class Person:
    """人的类型"""
    def __init__(self,name,age,gender):
        """属性初始化方法"""
        self.name = name
        self.age = age
        self.gender = gender

    def driver(self,car):
        """开车,人的行为"""
        print(f"{self.name}准备出发")
        #调用车对行驶的方法
        car.run("东北")

class Car:
    def __init__(self,brand,color):
        """属性初始化方法"""
        self.brand = brand
        self.color = color

    def run(self,area):
        print(f"{self.color}的{self.brand}发动了,准备去{area}")

# #创建出所有参数问题的对象
per1 = Person("老张",50,"男")
qirui = Car("瑞虎5x","灰色")
per1.driver(qirui)
#
# aodi = Car("奥迪A6","白色")
# per2 = Person("老王",45,"男")
# per2.driver(aodi)

3、文章发表


#发表文章练习
"""
文章有标题,作者,内容,可以保存,数据保存在类属性中
数据类型:可以保存数据
文章类型:
    属性:标题,作者,内容
    方法:保存
"""

class Database:
    """数据类型"""
    #保存文章的类属性
    article_dict = {}

class Article:
    def __init__(self,title,author,content):
        """实例属性初始化"""
        self.title = title
        self.author = author
        self.content = content

    def save(self):
        """保存文章数据"""
        #字典根据键保存值的方法  self是当前文章对象
        Database.article_dict[self.title] = self

#发表文章
title = input("请输入文章标题:")
author = input("请输入文章作者:")
content = input("请输入文章内容:")

#创建文章对象
article = Article(title,author,content)
#保存文章
article.save()

#查看文章数据
for title,article in Database.article_dict.items():
    print(f"标题:{title}\n文章内容:{article.content}")

返回文章目录


猜你喜欢

转载自blog.csdn.net/weixin_44238683/article/details/106011852