面向对象初接触

面向过程和面向对象的概念解耦的理解序言在写今天的内容之前先说叨几句,其实在python这门编程语言中的所有内容可以归结为俩种类型:一种是面向过程编程另一种是面向对象编程那么问题来了,之前听有些

大家好,又见面了,我是你们的朋友全栈君。

面向过程和面向对象的概念

解耦的理解

模块与模块之间的关联。解耦就是尽量让各个模块尽可能独立,这样的好处是尽可能的让各个模块的维护人员更专注本模块本身的功能和完善。至于模块怎么划分,你可以根据功能,也可以根据
业务模型,也可以根据编程的语言

序言

   在写今天的内容之前先说叨几句,其实在python这门编程语言中的所有内容可以归结为俩种类型:一种是面向过程编程另一种是面向对象编程

  那么问题来了,之前听有些码农说到我知道在python中除了面向过程编程就是面向对象编程这个是知道的,而什么是个面向过程编程,什么又是面向对象编程,就彻底蒙圈了。那么到底什么是面向过程编程,什么又是面向过程编程呢,我们通过倆个概念加示例来说明一下:

面向过程编程

面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。

优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。

缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。

应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。

面向对象编程

面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来

面向对象的程序设计

优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题即便是上帝也无法预测最终结果。

应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。

 为什么会使用面向对象编程

在python 中面向对象的程序设计并不是全部。

面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。

 初识类和对象

什么是类  什么是对象

举例:比如你现在有一个动物园,你想描述这个动物园,那么动物园里的每一种动物就是一个类,老虎、天鹅、鳄鱼、熊。他们都有相同的属性,比如身高体重出生时间和品种,还有各种动作,比如鳄鱼会游泳,天鹅会飞,老虎会跑,熊会吃。

但是这些老虎熊啥的都不是具体的某一只,而是一类动物。虽然他们都有身高体重,但是你却没有办法确定这个值是多少。如果这个时候给你一只具体的老虎,而你还没死,那你就能给他量量身高称称体重,这些数值是不是就变成具体的了?那么具体的这一只老虎就是一个具体的实例,也是一个对象。不止这一只,其实每一只具体的老虎都有自己的身高体重,那么每一只老虎都是老虎类的一个对象。

在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘’,对象是则是这一类事物中具体的一个。

我们知道了什么是类  什么是对象  那么该怎么声明它呢  不然没法使用啊…

类的声明

注意:什么类和之前什么函数相类似 只不过声明类使用的是class关键字必须写后面加类名:  不用加括号

class  类名:

<span role="heading" aria-level="2">面向对象初接触
<span role="heading" aria-level="2">面向对象初接触

class Data:       #使用class关键字 必须写   
    pass





class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法,也叫动态属性
        print("person is walking...")

类的声明 

类的作用

作用一  属性引用(操作 查看属性)

<span role="heading" aria-level="2">面向对象初接触
<span role="heading" aria-level="2">面向对象初接触

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

属性引用

作用二  实例化(生成对象)

实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征

 

实例化的过程就是类——>对象的过程,也就是对象产生的过程

语法:对象名 = 类名(参数)

<span role="heading" aria-level="2">面向对象初接触
<span role="heading" aria-level="2">面向对象初接触

egg = Person('egon')  #类名()就等于在执行Person.__init__() #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。 #你可以偷偷的理解:egg = {'name':'egon','walk':walk}

对象的产生

查看对象的属性和调用方法

<span role="heading" aria-level="2">面向对象初接触
<span role="heading" aria-level="2">面向对象初接触

print(egg.name)     #查看属性直接 对象名.属性名
 print(egg.walk())   #调用方法,对象名.方法名()

查看属性和调用方法

关于self

self:在实例化时自动将对象/实例本身传给__init__的第一个参数,self只是一个名字,你也可以用别的名字,但是业内约定俗成都会将其写为self。

对象的相关知识

class Person:  # 定义一个人类    role = 'person'  # 人的角色属性都是人    def __init__(self, name, aggressivity, life_value):        self.name = name  # 每一个角色都有自己的昵称;        self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;        self.life_value = life_value  # 每一个角色都有自己的生命值;    def attack(self,dog):          # 人可以攻击狗,这里的狗也是一个对象。        # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降        dog.life_value -= self.aggressivit

对象是关于类而实际存在的一个例子,即实例

对象/实例只有一种作用:属性引用

egg = Person('egon',10,1000)print(egg.name)print(egg.aggressivity)print(egg.life_value)

当然了,你也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,我们也管它叫动态属性。
引用动态属性并不是执行这个方法,要想调用方法和调用函数是一样的,都需要在后面加上括号

print(egg.attack)

面向对象小结

<span role="heading" aria-level="2">面向对象初接触
<span role="heading" aria-level="2">面向对象初接触

class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

小结

<span role="heading" aria-level="2">面向对象初接触
<span role="heading" aria-level="2">面向对象初接触

输出如下结果

妖王,1000岁,男,吃饭
妖王,1000岁,男,睡觉
妖王,1000岁,男,打豆豆
蛇妖,900岁,男,吃饭
蛇妖,900岁,男,睡觉
蛇妖,900岁,男,打豆豆

相关练习

对象间的交互

对象之间交互指的是不同的对象之间进行的操作

另外创建一个狗类

class Dog:  # 定义一个狗类    role = 'dog'  # 狗的角色属性都是狗    def __init__(self, name, breed, aggressivity, life_value):        self.name = name  # 每一只狗都有自己的昵称;        self.breed = breed  # 每一只狗都有自己的品种;        self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;        self.life_value = life_value  # 每一只狗都有自己的生命值;    def bite(self,people):        # 狗可以咬人,这里的狗也是一个对象。        # 狗咬人,那么人的生命值就会根据狗的攻击力而下降
     dog.life_value -= self.aggressivit

实例化一只具体的狗

ha2 = Dog('二愣子','哈士奇',10,1000)  #创造了一只实实在在的狗ha2

 下面真正的重头戏来了    人狗大战

<span role="heading" aria-level="2">面向对象初接触
<span role="heading" aria-level="2">面向对象初接触

class Person:  # 定义一个人类
    role = 'person'  # 人的角色属性都是人

    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一个角色都有自己的昵称;
        self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;

    def attack(self,dog):
        # 人可以攻击狗,这里的狗也是一个对象。
        # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
        dog.life_value -= self.aggressivity

class Dog:  # 定义一个狗类
    role = 'dog'  # 狗的角色属性都是狗

    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一只狗都有自己的昵称;
        self.breed = breed  # 每一只狗都有自己的品种;
        self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
        self.life_value = life_value  # 每一只狗都有自己的生命值;

    def bite(self,people):
        # 狗可以咬人,这里的狗也是一个对象。
        # 狗咬人,那么人的生命值就会根据狗的攻击力而下降
        people.life_value -= self.aggressivity

egg = Person('egon',10,1000)  #创造了一个实实在在的人egg
ha2 = Dog('二愣子','哈士奇',10,1000)  #创造了一只实实在在的狗ha2
print(ha2.life_value)         #看看ha2的生命值
egg.attack(ha2)               #egg打了ha2一下
print(ha2.life_value)         #ha2掉了10点血

人狗大战

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/124528.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Qt Quick之TableView的使用

    本博只是简单的展示TableView的基本使用(TableView、style:TableViewStyle、headerDelegate、rowDelegate、itemDelegate、Table

    2021年12月29日
  • Myeclipse注册码_为什么myeclipse

    Myeclipse注册码_为什么myeclipsemyeclipse6注册码生成最近由于项目使用eclipse+myeclipse开发工具开发,打开eclipse老是提示让激活myeclipse,需要注册码,于是去网上找了一些注册码来试,结果都不行,最后终于找到一篇文章介绍如何用Java程序生成注册码,参考百度经验原文:http://jingyan.baidu.com/article/a24b33cd53a9b819fe002ba5.html

  • MFC 自定义CListCtrl

    MFC 自定义CListCtrl本文的代码也是根据网上现有的改编而来首先是.h#pragmaonce#include”HeaderCtrlCl.h”//CListCtrlClclassCListCtrlCl:publicCListCtrl{DECLARE_DYNAMIC(CListCtrlCl)public:CHeaderCtrlClm_Header;CListCtrlCl();

  • 第六章 SDRAM控制器的设计

    第六章 SDRAM控制器的设计介绍的重点:·动态随机存储介绍·介绍SDARM的工作原理与Verilog的实现方法·基本实验:利用基本实例来解释SDRAM控制器顶层模块的设计·高级实验:利用高级实例来完整的描述SDRAM控制器顶层模块的修改技巧与注意事项…

  • UDP服务recvfrom函数设置非阻塞

    UDP服务recvfrom函数设置非阻塞本文先介绍我查看了的2篇文章,然后介绍linux和windows下的非阻塞设置。最后是非阻塞情况下接收情况的判断。2篇博文其实UDP的非阻塞也可以理解成和TCP是一样的,都是通过socket的属性去做。方法一:通过fcntl函数将套接字设置为非阻塞模式。方法二:通过套接字选项SO_RECVTIMEO设置超时。https://blog.csdn.net/daiyudong20…

  • DNS域名解析过程_谈谈域名解析DNS的工作原理

    DNS域名解析过程_谈谈域名解析DNS的工作原理一、主机解析域名的顺序1、找缓存2、找本机的hosts文件3、找DNS服务器注意:配置IP和主机名时,要记得修改/etc/hosts文件,因为有些应用程序在主机内的进程之间通信的时候,会本机

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号