1、面向过程编程
核心过程二字,过程指的是解决问题的步骤,即先干什么,再干什么
基于该思想编写程序就好比在设计一条流水线,是一种机械的思维方式。
优点:复杂的问题流程化,进而简单化
缺点:扩展性差
2、面向对象
核心"对象"二字,对象指的是特征与技能的结合体,基于该思想编写程序
就好比在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式
优点:可扩展性强
缺点:编程的复杂度高于面向过程
=================================================================
PS.面向对象仅仅是解决了可扩展性的问题,并没有代表全部

1、类
对象是特征与技能的结合体,那类就是一系列对象相同的特征与技能的结合体
2、在现实生活中P:一定是先有对象,后来随着人类文明的发展总结出的类,对象是具体存在的,而类只是一种抽象概念
3、在程序中,务必保证:先定义类,后调用类来产生对象
现实生活中的对象:
对象1:
特征:
school="Oldboy"
name="马冬梅"
age=18
sex="female"
技能:
学习
选课
对象2:
特征:
school="Oldboy"
name="甜蜜蜜"
age=21
sex="male"
技能:
学习
选课
对象3:
特征:
school="Oldboy"
name="原石开"
age=22
sex="male"
技能:
学习
选课
现实生活中的老男孩学生类:
相同的特征
school="Oldboy"
相同的技能
学习
选课
'''
类名一般用驼峰体
#1、程序中的类
class OldboyStudent:
# 用变量表示特征
school="Oldboy"
# 用函数表示技能
def learn(self):
print('is learning...')
def choose(self):
print('choose course...')
# print('======>')
注意:在定义类的阶段会立刻执行类体内的代码,然后将产生的名字存放于类名称空间中
print(OldboyStudent.__dict__)
print(OldboyStudent.__dict__['school'])
print(OldboyStudent.__dict__['learn'])
OldboyStudent.__dict__['learn'](123)
print(OldboyStudent.school) # OldboyStudent.__dict__['school']
print(OldboyStudent.learn) # OldboyStudent.__dict__['learn']
OldboyStudent.learn('xxx')
OldboyStudent.learn('xxx')
OldboyStudent.country='China' #新增属性
OldboyStudent.school='偶的博爱' #改属性
del OldboyStudent.country
print(OldboyStudent.__dict__)
2、调用类,产生程序中的对象
产生对象
类名称空间与对象名称空间以及属性查找
# 1、程序中的类
class OldboyStudent:
# 用变量表示特征
school = "Oldboy"
# stu1, "马冬梅", 18, 'female'
def __init__(self, name, age, sex):
# self=stu1 name= "马冬梅" age=18 sex="female"
# print('==========init run=============>')
self.name = name # stu1.name = "马冬梅"
self.age = age # stu1.age = 18
self.sex = sex # stu1.sex = "female"
# 用函数表示技能
def learn(self):
print('is learning...', self)
def choose(self):
print('choose course...')
在程序中:必须先定义类 - -----》调用类 - -----》对象
stu1=OldboyStudent()
stu1.NAME='马冬梅'
stu1.AGE=18
stu1.SEX="female"
stu2=OldboyStudent()
stu2.NAME='甜蜜蜜'
stu2.AGE=21
stu2.SEX="male"
stu3=OldboyStudent()
stu3.NAME='原石开'
stu3.AGE=22
stu3.SEX="male"
print(stu1.NAME,stu1.school)
print(stu2.NAME,stu2.school)
print(stu3.NAME,stu3.school)
上述产生的三个对象都一样了
调用类发生哪些事:
1、首先会产生一个空对象stu1
2、会自动触发类内部的__init__函数
3、然后将空对象stu1连同调用类时括号内的参数组成(stu1,"马冬梅",18,'female'),
将这四个参数一起传给__init__函数
stu1=OldboyStudent("马冬梅",18,'female')
#OldboyStudent.__init__(stu1,"马冬梅",18,'female')
stu2=OldboyStudent("甜蜜蜜",21,'male')
#OldboyStudent.__init__(stu2,"甜蜜蜜",21,'male')
stu3=OldboyStudent("原石开",22,'male')
print(stu1.name,stu1.age,stu1.sex)
print(stu2.name,stu2.age,stu2.sex)
print(stu3.name,stu3.age,stu3.sex)
类名称空间与对象名称空间以及属性查找
school = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
class OldboyStudent:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
# self=stu1
def learn(self):
print('%s is learning' % self.name)
def choose(self, course):
print('%s is choosing %s' % (self.name, course))
# 调用类---》产生类的对象,该对象也可以称为类的一个实例,
# 调用类的过程也称为类的实例化
stu1 = OldboyStudent('李三胖', 18, 'male')
# OldboyStudent.__init__(stu1,'李三胖',18,'male')
# OldboyStudent.country='CHINA'
# print(OldboyStudent.country)
# print(OldboyStudent.__dict__)
# print(stu1.__dict__)
# print(stu1.__dict__['name'])
# print(stu1.name)
# print(stu1.school)
# print(school)
stu2 = OldboyStudent('王大炮', 28, 'male')
# print(stu2.__dict__)
# 类内部定义的变量是给所有对象共享,所有对象指向的都是同一个内存地址
# print(id(stu1.school))
# print(id(stu2.school))
# print(id(OldboyStudent.school))
绑定方法的特殊之处
类内部定义的函数,类可以使用,但类来用的时候就是一个普通函数,
普通函数有几个参就传几个参数
print(OldboyStudent.learn)
OldboyStudent.learn(123)
类内部定义的函数,其实是给对象使用的,而且是绑定给对象用,
绑定给不同的对象就是不同的绑定方法
print(stu1.learn)
print(stu2.learn)
绑定方法的特殊之处在于,谁来调用,就会将谁当作第一个参数自动传入
stu1.learn() # OldboyStudent.learn(stu1)
stu2.learn() # OldboyStudent.learn(stu2)
stu1.choose('python')
stu2.choose('linux')
一切皆对象
class OldboyStudent:
school='oldboy'
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
#self=stu1
def learn(self):
print('%s is learning' %self.name)
def choose(self,course):
print('%s is choosing %s' %(self.name,course))
stu2=OldboyStudent('王大炮',28,'male')
# print(id(stu2))
# print(type(stu2)) # 类与类型是一个概念
# print(stu2)
l1=[1,2,3] #l1=list([1,2,3])
# print(type(l1))
# l1.append(4)
list.append(l1,4)
print(l1)
l2=['a','b','c']
l2.append('d')
# list.append('d')
print(l2)
print(int)
print(str)
print(dict)
print(tuple)
print(set)
print(OldboyStudent)
小练习 (实例化三次)
# class Foo: # n=0 # def __init__(self): # Foo.n+=1 # Foo.n=3 # # obj1=Foo() # obj2=Foo() # obj3=Foo() # print(obj1.__dict__) # print(obj2.__dict__) # print(obj3.__dict__) # # print(obj1.n) # print(obj2.n) # print(obj3.n)
对象交互之人狗大战
#对对象属性的增删改查
# class Bar:
# n=1111111111
# def __init__(self,x):
# self.x=x
#
# obj=Bar(111)
#
# # print(obj.__dict__)
# # print(obj.n)
# obj.y=2
# obj.n=3
# print(obj.__dict__)
# print(obj.n)
#
# obj.x=123
# del obj.x
# print(obj.x)
'''
现实中的对象:
人1
特征:
名字='刘晴政'
攻击力=60
生命值=100
技能:
咬
人2
特征:
名字='王苗璐'
攻击力=50
生命值=100
技能:
咬
现实中的人类
相同的特征
相同的技能
咬
'''
'''
现实中的对象:
狗1
特征:
名字='武培其'
品种="京巴"
攻击力=80
生命值=50
技能:
咬
人2
特征:
名字='李杰'
品种="藏獒"
攻击力=200
生命值=200
技能:
咬
现实中的狗类
相同的特征
相同的技能
咬
'''
class People:
def __init__(self, name, aggresivity, life_value=100):
self.name = name
self.aggresivity = aggresivity
self.life_value = life_value
def bite(self, enemy): #self=p1 enemy=d1
enemy.life_value-=self.aggresivity
print("""
人[%s] 咬了一口狗 [%s]
狗掉血[%s]
狗还剩血量[%s]
""" %(self.name,enemy.name,self.aggresivity,enemy.life_value)
)
class Dog:
def __init__(self, name, dog_type, aggresivity, life_value):
self.name = name
self.dog_type = dog_type
self.aggresivity = aggresivity
self.life_value = life_value
def bite(self, enemy): #self = d1 enemy= p1
enemy.life_value-=self.aggresivity
print("""
狗[%s] 咬了一口人 [%s]
人掉血[%s]
人还剩血量[%s]
""" %(self.name,enemy.name,self.aggresivity,enemy.life_value)
)
p1 = People('刘清政', 60)
d1=Dog('李杰',"藏獒",200,200)
p1.bite(d1)
d1.bite(p1)
绑定:谁调用他就代表谁
相关补充
在python3中定义类的时候默认定义继承object的类,方便python2识别 class OldboyPeople(object): #python为类内置的特殊属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中) 类的特殊属性(了解即可)
今日作业
面向对象作业
1.默写:面向对象与面向过程的优缺点对比,及使用场景
2.初始化函数的作用是什么,有什么特点
作用: init 函数用于初始化对象,它会在创建对象时,自动执行, 并传入调用类时传递的参数,第一个参数表示要初始化的对象本身, 特点: self(第一个)参数不需要手动传递 self表示对象自己 是一个形式参数,名字可以随便取,但是不建议修改
3.什么是绑定方法,有什么特点
绑定方法:把对象与函数进行绑定 特点:谁来调用,就会将谁当作第一个参数自动传入
4.对象与类的属性查找顺序什么怎么样的
当对象中不存在是会到类里面查找,如果对象中存在这个属性,优先访问对象中的属性 # 查找顺序为 对象 -> 类
5.什么是类? 什么是对象?
对象是特征与技能的结合体 类是一系列特征与技能的结合体
6.扩展题
设计王者荣耀中的英雄类,每个英雄对象可以对其他英雄对象使用技能
具备以下属性
英雄名称,等级,血量
和Q_hurt,W_hurt,E_hurt 三个属性,表示各技能的伤害量
具备以下技能
Q W E
三个技能都需要一个敌方英雄作为参数,当敌方血量小于等于0时输出角色死亡
class Hero:
def __init__(self,name,level,hp,Q_hurt,W_hurt,E_hurt):
self.name = name
self.level = level
self.hp = hp
self.Q_hurt = Q_hurt
self.W_hurt = W_hurt
self.E_hurt = E_hurt
def Q(self,enemy):
enemy.hp -= self.Q_hurt
print("%s 对%s 释放了 %s 技能" % (self.name,enemy.name,"Q"))
print("造成了%s点伤害,剩余血量%s" % (self.Q_hurt, enemy.hp))
if enemy.hp <= 0:
print("%s被%s弄死了" % (enemy.name,self.name))
def W(self,enemy):
enemy.hp -= self.W_hurt
print("%s 对%s 释放了 %s 技能" % (self.name, enemy.name, "W"))
print("造成了%s点伤害,剩余血量%s" % (self.W_hurt,enemy.hp))
if enemy.hp <= 0:
print("%s被%s弄死了" % (enemy.name, self.name))
def E(self,enemy):
enemy.hp -= self.E_hurt
print("%s 对%s 释放了 %s 技能" % (self.name, enemy.name, "E"))
print("造成了%s点伤害,剩余血量%s" % (self.E_hurt, enemy.hp))
if enemy.hp <= 0:
print("%s被%s弄死了" % (enemy.name, self.name))
# 创建两个英雄
hero1 = Hero("小妲己",15,2000,50,500,600)
hero2 = Hero("小鲁班",15,1500,50,500,600)
hero1.Q(hero2)
hero1.W(hero2)
hero1.E(hero2)
hero1.E(hero2)