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()

  

 

转载于:https://www.cnblogs.com/hanayo/p/9532061.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值