初学面向对象

author author     2022-10-09     657

关键词:

一、面向过程和面向对象的比较

1、面向过程

面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,是一种机械式的思维方式。


优点是:复杂度的问题流程化,进而简单化

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


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


2、面向对象

面向对象的程序设计:核心是对象二字,对象是特征与技能的结合体,基于面向对象设计程序就好比在创造一个世界,存在的皆为对象,不存在的也可以创造出来。


优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中。


缺点:

1. 编程的复杂度远高于面向过程,不了解面向对象而立即上手基于它设计程序,极容易出现过度设计的问题。一些扩展性要求低的场景使用面向对象会徒增编程难度,比如管理linux系统的shell脚本。

2. 无法很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,无法准确地预测最终结果,只有对象之间交互才能准确地知道最终的结果。


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


#面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性。

二、类与对象

1、类的介绍

类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体


在现实世界中:先有对象,再有类

在程序中:   务必保证先定义类,后产生对象

2、定义类

class Student:
    school = 'Middle school'           #数据属性
    def learn(self):                 #函数属性
        print('is learning')
    def sleep(self):
        print('is sleeping')

# 注意:

    1.类中可以有任意python代码,这些代码在类定义阶段便会执行

    2.因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过OldboyStudent.__dict__查看

    3.对于经典类来说我们可以通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的.语法

    4.点是访问属性的语法,类中定义的名字,都是类的属性

3、类的用法

基于上面定义的类来研究用法:

print(Student.school)           #结果是Middle school
print(Student.__dict__)         #查看类名称空间的信息
print(Student.learn)           #结果是<function Student.learn at 0x00000000021C98C8>
Student.age=18               #添加属性
print(Student.age)
Student.school = 'Primary school'   #修改属性
print(Student.school)           #结果是Primary school
del Student.age               #删除属性
print(Student.age)             #报错,age属性找不到,说明已经删除了

4、类在程序中的应用

class Student:
    school = 'Middle school'
    def __init__(self,name,age,sex):  #实例化得到特有的信息
        self.name=name
        self.age=age
        self.sex=sex
    def learn(self):                 #函数属性
        print('%s is learning' %self.name)
stu1=Student('wang',20,'male')
stu2=Student('li',22,'male')
print(stu1.__dict__)                  #{'name': 'wang', 'age': 20, 'sex': 'male'}
print(stu2.__dict__)                 #{'name': 'li', 'age': 22, 'sex': 'male'}
Student.learn(stu1)                  #结果wang is learning

补充:

(1)站的角度不同,定义出的类是截然不同的,详见面向对象实战之需求分析

(2)现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类......

(3)有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类

5、用类实现数据库连接:

class MySQLHandler:
    def __init__(self,host,port,db,charset='utf8'):
        self.host=host
        self.port=port
        self.db=db
        self.charset=charset
        self.conn=connect(self.host,self.port,self.db,self.charset)
    def exc1(self,sql):
        return self.conn.execute(sql)
    def exc2(self,sql):
        return self.conn.call_proc(sql)
obj=MySQLHandler('127.0.0.1',3306,'db1')
obj.exc1('select * from tb1;')
obj.exc2('存储过程的名字')

三、属性查找

1、类的属性

类有两种属性:数据属性和函数属性

(1)类的数据属性是所有对象共享的

(2)类的函数属性是绑定给对象用的

2、实例:编写一个学生类,产生一堆学生对象,要求有一个计数器(属性),统计总共实例了多少个对象

class Student:
    count=0
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
        Student.count+=1
    def learn(self):                 #函数属性
        print('is learning')
stu1=Student('wang',20,'male')
stu2=Student('li',22,'male')
stu3=Student('jim',25,'male')
print(stu1.count)                  #结果为3
print(stu2.count)                  #结果为3
print(stu3.count)                  #结果为3

3、绑定到对象的方法

类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数

类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法


强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)

注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。

四、对象之间的交互

1、简单实现对战

class Poilce:
    camp ='justice'            #阵营是正义
    def __init__(self,name,attacking=55,life_value=300):
        self.name=name
        self.attacking=attacking
        self.life_value=life_value
    def attack(self,opponent):    #定义攻击,指定对手
        opponent.life_value-=self.attacking
class Robber:
    camp ='evil'             #阵营是邪恶
    def __init__(self,name,attacking=60,life_value=270):
        self.name=name
        self.attacking=attacking
        self.life_value=life_value
    def attack(self,opponent):    #定义攻击,指定对手
        opponent.life_value-=self.attacking
p1=Poilce('大兵')
r1=Robber('海盗')
print('p1的名字是%s r1的名字是%s '%(p1.name,r1.name))              #p1的名字是大兵 r1的名字是海盗
print('p1的生命值是%s r1的生命值是%s '%(p1.life_value,r1.life_value))   #p1的生命值是300 r1的生命值是270
p1.attack(r1)                                        #p1发起攻击
print('p1的生命值是%s r1的生命值是%s '%(p1.life_value,r1.life_value))   #p1的生命值是300 r1的生命值是215

2、基于面向对象设计一个对战游戏

class Riven:
    camp='Noxus'                          #Noxus阵营
    def __init__(self,nickname,
                 aggressivity=54,          #攻击力
                 life_value=414,           #生命值
                 money=1001,
                 armor=3):                #盔甲
        self.nickname=nickname
        self.aggressivity=aggressivity
        self.life_value=life_value
        self.money=money
        self.armor=armor
    def attack(self,enemy):
        damage_value=self.aggressivity-enemy.armor    #给对方造成的伤害值
        enemy.life_value-=damage_value            #对手每次受到伤害生命值需要减掉伤害值
class Garen:
    camp='Demacia'
    def __init__(self,nickname,
                 aggressivity=58,
                 life_value=455,
                 money=100,
                 armor=10):
        self.nickname=nickname
        self.aggressivity=aggressivity
        self.life_value=life_value
        self.money=money
        self.armor=armor
    def attack(self,enemy):
        damage_value=self.aggressivity-enemy.armor
        enemy.life_value-=damage_value
class BlackCleaver:                         #定义装备
    def __init__(self,price=475,aggrev=9,life_value=100):
        self.price=price
        self.aggrev=aggrev
        self.life_value=life_value
    def update(self,obj):
        obj.money-=self.price            #减钱
        obj.aggressivity+=self.aggrev       #加攻击
        obj.life_value+=self.life_value     #加生命值
    def fire(self,obj):                 #这是该装备的主动技能,喷火,烧死对方
        obj.life_value-=1000            #假设火烧的攻击力是1000


测试:

r1=Riven('草丛伦')
g1=Garen('盖文')
b1=BlackCleaver()
print(r1.aggressivity,r1.life_value,r1.money)   #r1的攻击力,生命值,护甲 54 414 1001
if r1.money > b1.price:                  #r1的钱足够买装备,就执行装备类的update函数,给r1修改属性
    r1.b1=b1
    b1.update(r1)
print(r1.aggressivity,r1.life_value,r1.money)    #r1的攻击力,生命值,护甲 63 514 526
print(g1.life_value)      #g1生命值455
r1.attack(g1)           #普通攻击(现在r1的攻击是穿上装备后的攻击力)
print(g1.life_value)      #g1生命值402
r1.b1.fire(g1)          #用装备攻击
print(g1.life_value)      #g1的生命值小于0就死了,值为-598



初学者教程------java面向对象篇

第一章面向对象1.1什么是对象------万物皆对象1.2什么是面向对象------面向对象就是以特征(属性)和行为(方法)的观点去分析万物的方式1.3什么是面向对象编程?------先使用面向对象的方式进行分析,再... 查看详情

初学者教程------java面向对象篇

第一章面向对象1.1什么是对象------万物皆对象1.2什么是面向对象------面向对象就是以特征(属性)和行为(方法)的观点去分析万物的方式1.3什么是面向对象编程?------先使用面向对象的方式进行分析,再... 查看详情

初学面向对象

1.类,属性,对象,方法的理解  首先我们把汽车,大象,狗,摩托,自行车,猫分成俩类  我们自然而然的会把这些分为两类(1)大象,狗,猫(2)自行车,汽车,摩托  为什么这么分呢?很明显他们每... 查看详情

java+面向对象初学感想

在先导课之前我未曾接触C和Python之外的语言,在大一学年的课程中,用面向过程的思想方法足以完成绝大多数课程要求,故而我也对面向对象的编程思想知之甚少,虽然多有耳闻但是对它一直没有一个正式的学习了解也没有任... 查看详情

初学者教程------java面向对象篇

第二章面向对象进阶1、成员变量(1)成员变量(全局变量)①实例属性------没有static②类属性------有static(2)局部变量①形参②方法2、this关键字------为了解决成员变量(全局变量)和局部变量同... 查看详情

初学者教程------java面向对象篇

第二章面向对象进阶1、成员变量(1)成员变量(全局变量)①实例属性------没有static②类属性------有static(2)局部变量①形参②方法2、this关键字------为了解决成员变量(全局变量)和局部变量同... 查看详情

初学者教程------java面向对象篇

第一章面向对象1.1什么是对象------万物皆对象1.2什么是面向对象------面向对象就是以特征(属性)和行为(方法)的观点去分析万物的方式1.3什么是面向对象编程?------先使用面向对象的方式进行分析,再... 查看详情

java面向对象--------jdbc初学者教程(代码片段)

连接数据库:packagecom.sql;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importcom.mysql.jdbc.Connection;publicclassDbConnectionstaticfinalStringDRIVERNAME= 查看详情

初学者教程------java面向对象篇(代码片段)

第11章Swing高级应用1、单选按钮的构建①声明控件JRadioButtomjr1;②初始化控件jr1=newJRadioButtom("榴莲");③添加控件到窗体对象中frame.add(jr1);2、复选框的构建JcheckBoxcomboBox=newJcheckBox("----------");3、下拉框的构建JcheckBoxc... 查看详情

初学者教程------java面向对象篇(代码片段)

第11章Swing高级应用1、单选按钮的构建①声明控件JRadioButtomjr1;②初始化控件jr1=newJRadioButtom("榴莲");③添加控件到窗体对象中frame.add(jr1);2、复选框的构建JcheckBoxcomboBox=newJcheckBox("----------");3、下拉框的构建JcheckBoxc... 查看详情

java初学——面向对象异常(代码片段)

一、异常  1.什么是异常    异常是指程序在运行是发生的不正常事件,会中断运行的程序称之为异常  2.什么是异常处理    Java编程语言使用异常处理机制为程序提供了错误处理的能力。一般处理顺序为:程序中... 查看详情

您如何解释一个外行或编程初学者,面向对象方法的大胆点 - 安全? [关闭]

】您如何解释一个外行或编程初学者,面向对象方法的大胆点-安全?[关闭]【英文标题】:Howwouldyouexplainalaymanpersonorabeginnerinprogramming,theboldpointofobjectorientedapproach-theSECURITY?[closed]【发布时间】:2013-09-1208:10:21【问题描述】:安全... 查看详情

初学者教程------java面向对象篇(代码片段)

**第三章多态与继承**1、包等于文件使用步骤:(1)自定义包------创建一个包src------new------package(2)com开头------com.模块名,比如:com.test/demo(3)包的导入------不同包中的类相互调用java语法&#x 查看详情

初学者教程------java面向对象篇(代码片段)

**第三章多态与继承**1、包等于文件使用步骤:(1)自定义包------创建一个包src------new------package(2)com开头------com.模块名,比如:com.test/demo(3)包的导入------不同包中的类相互调用java语法&#x 查看详情

初学者——面向对象的理解03(代码片段)

什么叫做继承继承是Java中实现代码重要的重要手段之一。Java中只支持单根继承,即一个类只能有一个直接父类。简单点来说就是继承是类和类之间的关系。为什么要使用继承提升代码的复用性减少代码的冗余继承的创建class子... 查看详情

java面向对象--------初学者教程--------java与mysql表格数据的绑定

1.数据库链接2.定义StringSQL语句publicclassEmpOperatorstaticConnectionconn=null;staticjava.sql.Preparedmentps=null;staticResultSetrs=null;//查询结果集的方法publicstaticString[][]getTableData()ArrayList<E 查看详情

java初学——面向对象的封装,继承,多态(代码片段)

一、封装  1.为什要封装    封装的概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。把尽可能多的东西藏起来,对外提供便捷的接口。    ... 查看详情

javascript初学篇章_5(对象)

...地对象1.Date日期对象用来处理日期和时间。在《Javascript初学篇章_1》中就有提到过varmyDate=newDate();myDate.ge 查看详情