Day 13面向对象
什么是面向对象?
面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......
面向对象的程序设计:核心是对象二字,对象是特征与技能的结合体,基于面向对象设计程序就好比在创造一个世界,你就是这个世界的上帝,存在的皆为对象,不存在的也可以创造出来,与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界的模拟,是一种“上帝式”的思维方式。
类与对象
简单的来说,类的实例化是对象,对象的抽象化是类。
class Person: #定义一个类-->人类 animal = '高级动物' soul = '有信仰' # 类的静态属性-->人类所具有的属性 language = '语言' def __init__(self, name, age, sex): # 特殊方法 self.name1 = name self.age1 = age self.sex1 = sex def eat(self): # 人类的一些方法 print('吃') def sleep(self): print('睡') def work(self): print('工作') p1 = Person('小明', '10岁', '男') # 实例化一个人,p1这个人(小明)就是一个对象。 实例化
实例化过程的三个阶段:
1.程序执行到p1=Person()时会开辟一个对象空间,与类空间不同
2.自动执行类中的__init__方法,并将对象空间(地址)自动传给self参数,其他的参数手动传入
3.执行__init__方法,给这个对象空间封装对应的属性
对象操作
例:创造一个游戏人物ruabk class GameRole: rule = '666' def __init__(self, hp, mp, speed, attack, attack_area): self.hp = hp self.mp = mp self.speed = speed self.attack = attack self.attack_area = attack_area def increase(self): level = 25 return level ruabk = GameRole(560, 430, 290, 61, 560)
对象可以操作对象空间:
对象空间的增删改查
print(ruabk.__dict__) # 查看对象属性
print(ruabk.attack) # 查看其中的某一项
ruabk.defense = 5 # 增加一个属性
ruabk.attack = 67 # 改对象的属性
del ruabk.mp # 删除某一个属性
print(ruabk.__dict__)
对象可以查看类空间属性
print(ruabk.rule) # 只能查看类空间的属性,无法修改类空间的属性
ruabk.rule = 777 # 只是在ruabk的后面加了一个属性,而没有修改类空间的rule
print(ruabk.__dict__)
print(GameRole.__dict__)
对象可以操作类空间方法
ruabk.increase() # 执行类空间的increse方法
问题1.对象为什么能调用类中的属性与方法而且只是调用,不能改变?
ruabk.名称 python会先在ruabk自己空间中找,没有此值会通过类对象指针从类中找,类中找不到会在往父集类中找
利用对象来改类空间的属性 如:ruabk.rule = 777
相当于给ruabk新增了一个属性,而不是对类中rule的修改
问题2,类能不能调用对象的属性? 不能
问题3,对象与对象之间可不可互相调用?
同一个类实例化出来的对象之间是不能互相访问的
不同类实例化出来的对象有可能互相访问
给对象封装一个属性:__init__可以在任意位置
组合
class Gamerole: # 定义一个人物角色类
def __init__(self, nickname, ad, hp): # 游戏人物的属性
self.nickname = nickname
self.ad = ad
self.hp = hp
def attack(self, role): # 游戏人物的攻击
role.hp = role.hp - self.ad
print('%s攻击%s,%s掉了%s血,还剩%s血' % \
(self.nickname, role.nickname, role.nickname, self.ad, role.hp))
def get_weapon(self, w): # 给人物增加一个属性,令这个属性等于另一个类的对象,这样两个类中的对象就关联起来了。
self.weapon = w
class Weapon: # 定义一个武器类
def __init__(self, name, ad): # 武器的属性
self.name = name
self.ad = ad
def fight(self, role1, role2): # 武器的攻击
role2.hp = role2.hp - self.ad
print('%s 用 %s 攻击了%s, %s掉了%s血,还剩%s血' \
% (role1.nickname, self.name, role2.nickname, role2.nickname, self.ad, role2.hp))
p1 = Gamerole('盖伦', 20, 200)
p2 = Gamerole('亚索', 50, 100)
w1 = Weapon('大保健', 20)
w2 = Weapon('武士刀', 80)
p2.get_weapon(w2) # 让第一个类中的人物获得w2这个对象
p2.weapon.fight(p2, p1) # p2.weapon实际就等于w2,这个相当于w2.fight()