面向对象和面向过程
面向过程:优点:复杂问题流程化,进而简单化
缺点:可扩展性差
面向对象
面向过程的设计设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么,面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式
优点是:复杂的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)
缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。
类与对象
类即类别,种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体
那么问题来了,先有一个个具体存在的对象(比如一个具体存在的人),还是先有人类这个概念,这个问题需要分两种情况去看
现实世界中:先有对象,再有类
在程序中:务必先定义类,后产生对象
class Stundent:
school='oldboy'
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def learn(self):
print('%s is learning' %self.name) ##新增self.name
def eat(self):
print('%s is eating'%self.name)
def sleep(self):
print('%s is sleeping'%self.name)
s1=Stundent('李钟硕','男',23)
s2=Stundent('李二狗','男',25)
s3=Stundent('李三狗','男',21)
类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
注意:绑定对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self
类与对象
-定义类
class关键字 类名:
pass
-产生对象
对象=类名()
-类:
1、对象获取属性和方法
类.__dict__
2、类来调用属性和方法
通过dict来取
类名.属性/函数
-对象:
1、对象获取属性和方法
对象.__dict__
2、对象来调用属性和方法
对象.属性/方法
产生对象(绑定方法,属性的查找顺序)
-属性查找顺序
-先从对象自身找----》类中找----》保错
-对象赋属性
-方式一:
stu1=Student()
stu1.name='lzs'
-方式二:
-在类中定义该方法,方法上写一些参数
-在对象实例化产生对象时,在括号中传的值,会被传到__init__中
-绑定方法:
-定义在类内部
-对象来调用,会自动把对象传过来,在方法内部就可以修改该对象
class Student:
#变量表示属性
school='oldboy'
#__init__看好名字,不是__int__
def __init__(x,name):
x.name=name
def choose(self)
print('===选课===')
def study(self):
print('%s学会了python'%self.name)
stu1=Student('lzs')
stu1.study()
##lzs学会了python
一切皆对象
#类即类型
ll=[1,2,3]
#类实例化产生对象
l1=list([1,2,3])
l2=list([5,7,8])
#对象调用对象的绑定方法,修改对象自己
l1.append(5)
print(l1)
list.append(l1,9)
print(l1)
print(type(l1))
人狗大战:
class Dog:
type_dog='藏獒'
def __init__(self,name,aggressivity,hp=100):
self.name=name
self.aggressivity=aggressivity
self.hp=hp
def bite(self,target):
##当前狗的攻击力:self.aggressivity
##人的血量:target.hp
target.hp-=self.aggressivity
print('''
狗的品种:%s
%s狗咬了一下%s人
人掉血:%s
人的血量剩余:%s
'''%(self.type_dog,self.name,target.name,self.aggressivity,target.hp))
class Human:
def __init__(self,name,aggressicity,hp=100):
self.name=name
self.aggressivity=aggressicity
self.hp=hp
def bite(self,target):
target.hp-=self.aggressivity
print('''
%s人咬了一下%s狗,
狗掉血:%s
狗的血量:%s
'''%(self.name,target.name,self.aggressivity,target.hp))
##实例化产生狗对象
dog1=Dog('旺财',10,200)
nick=Human('nick',50)
dog1.bite(nick)
print(nick.hp)
游戏打斗:
class yuji:
camp='虞姬'
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
##enemy:仇人 damage:损伤
def attack(self,enemy):
damage_value=self.aggressivity-enemy.armor
enemy.life_value-=damage_value
class luban:
camp='鲁班'
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,aggressivity=9,life_value=100):
self.price=price
self.aggressivity=aggressivity
self.life_value=life_value
def update(self,obj):
obj.money-=self.price
obj.aggressivity+=self.aggressivity
obj.life_value+=self.life_value
def fire(self,obj):
obj.life_value-=1000
r1 = yuji('虞姬')
g1 = luban('鲁班')
b1 = BlackCleaver()
print('''
虞姬的攻击力为%s,
生命值为%s,
账户余额为%s
'''%(r1.aggressivity,r1.life_value,r1.money))
print('''
鲁班的攻击力为%s,
生命值为%s,
账户余额为%s
'''%(g1.aggressivity,g1.life_value,g1.money))
if r1.money>b1.price:
print('虞姬购买多兰之刃成功')
r1.aggressivity+=9
r1.life_value+=100
r1.money-=475
print('''
虞姬的攻击力为%s
虞姬的生命值为%s
虞姬的账户余额为%s
'''%(r1.aggressivity,r1.life_value,r1.money))
count=0
while True:
r1.attack(g1)
count+=1
g1.life_value-=r1.aggressivity
print('''
鲁班受到一次攻击,生命值为%s
'''%(g1.life_value))
if g1.life_value<0:
break
print(f'鲁班受到{count}攻击死亡')