Pyhton精讲day12--Python面向对象基础编程

类和对象

万物皆对象
在这里插入图片描述
分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地将对象进行进行分类

对象归类

类是抽象的概念,仅仅是模板 比如说:“人”
对象是一个你能够看得到、摸得着的具体实体: 赵本山,刘德华,赵丽颖

  • 对象的特征——属性
    属性——对象具有的各种特征。 每个对象的每个属性都拥有特定值。 例如:顾客张浩和李明的年龄、姓名不一样。
  • 对象的特征——方法(操作,行为)
    对象:用来描述客观事物的一个实体,由一组属性和方法构成
    在这里插入图片描述
类型:狗
对象名:doudou
属性:
颜色:白色
方法:
叫,跑,吃

从对象抽象出“类”

在这里插入图片描述
是对象的模板, 对象是类的具体实例

# 面向过程考虑问题: 把大象塞进冰箱里
# 面向对象(oop)考虑问题: 把我们研究的事物都看成对象, 一切都是对象
name1 = "eric"
name2 = "Bob"
# 我们发现将具有相同特性的对象归为'一类'进行描述, 这样就有了'类'的概念
# 怎么描述类呢, 怎么通过类生成对象呢
# 类是对象的模板, 对象是类的具体实例
# 类的定义
# class 类名(父类):
#     pass

class Student(object):
    # 定义属性: 这个类有什么静态特性
    def __init__(self):
        self.id = None
        self.name = None
        self.score = None
    # oop里我们叫方法, 就是以前的函数, 只是多了个self
    def printInfo(self):
        print(f'学号: {self.id}  姓名: {self.name} 分数: {self.score}')
# 使用类: 类创建对象的过程叫做类的实例化
# 对象名 =  类名()
s1 = Student()
# 调用对象的方法  对象名.方法名(参数)
s1.printInfo()
# 为对象属性赋值
s1.name = 'mmx'
s1.score = 100
s1.id = 123456
s1.printInfo()
s2 = Student()
s2.name = 'eric'
s2.score = 60
s2.id = 123457
s2.printInfo()
# 写一个你喜欢的类型: 汽车 或 手机 , 进行类似上面的描述

在这里插入图片描述

  • __init__函数: 魔法函数中的一种
    当类创建对象的时候, 会自动调用这个方法, init()主要作用就是初始化对象的属性值
class Student(object):
    # 定义属性: 这个类有什么静态特性
    def __init__(self, id, name=None, score=0):
        print("__init__(self) 被调用")
        self.id = id
        self.name = name
        self.score = score
    # oop里我们叫方法, 就是以前的函数, 只是多了个self
    def printInfo(self):
        print(f'学号: {self.id}  姓名: {self.name} 分数: {self.score}')
# s1 = Student() # 无参构造函数
s2 = Student(666, 'Bob', 24)
s2.printInfo()
s3 = Student(8888)
s3.printInfo()
  • self 是什么
    self就是当前类产生的对象, 那个对象正在调用, self就是谁
class Student(object):
    # 定义属性: 这个类有什么静态特性
    def __init__(self, id, name=None, score=0):
        print("__init__(self) 被调用")
        self.id = id
        self.name = name
        self.score = score
    # oop里我们叫方法, 就是以前的函数, 只是多了个self
    def printInfo(self):
        print(f'self的地址是{id(self)}')
        print(f'学号: {self.id}  姓名: {self.name} 分数: {self.score}')
    def setScore(self, new_score):
        self.score = new_score
# s1 = Student() # 无参构造函数
s2 = Student(666, 'Bob', 24)
print(id(s2)) # 140651114559520
s2.printInfo()
s3 = Student(8888)
print(id(s3)) # 140663523451856
s3.printInfo(88)
s3.setScore()
s3.printInfo()
  • str 方法
    在这里插入图片描述

在这里插入图片描述

class Student(object):
    def __init__(self, id, name=None, score=0):
        self.id = id
        self.name = name
        self.score = score
    def printInfo(self):
        print(f'学号: {self.id}  姓名: {self.name} 分数: {self.score}')
    def __str__(self):
        return f'学号: {self.id}  姓名: {self.name} 分数: {self.score}'
s1 = Student(666, 'Bob', 24)
print(s1)
print(id(s1))
s2 = Student(8888)
print(s2)

私有属性—封装

在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到

定义方式: 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线__ 实际开发中私有属性也不是一层不变的。所以要给私有属性提供外部能够操作的方法。

class Student(object):
    def __init__(self, id, name=None, score=0):
        self.id = id
        self.name = name
        self.__score = score
    def __str__(self):
        return f'学号: {self.id}  姓名: {self.name} 分数: {self.__score}'
s1 = Student(666, 'Bob', 24)
print(s1)
print(id(s1))
s2 = Student(8888)
print(s2)
print(s1.id)
print(s1.name)
print(s1.__score)

在这里插入图片描述

编程实例: 鲁班打大龙

hero.py

from random import randint
class Hero(object):
    def __init__(self, name, blood, strength):
        self.name = name
        self.blood = blood
        self.strength = strength

    def take_damage(self, monster):
        damage = randint(monster.strength - 5, monster.strength + 5)
        self.blood -= damage
        print(f'{self.name} 你被 {monster.name}攻击, 受到了{damage}点伤害!, 还剩{self.blood}滴血..')
        if self.blood <= 0:
            print(f'{self.name} 你被 {monster.name}杀死了; 胜败乃兵家常事, 请重新来过!')
            return True
        else:
            return False

monster.py

from random import randint
class Montser(object):
    def __init__(self, name, blood, strength):
        self.name = name
        self.blood = blood
        self.strength = strength

    def take_damage(self, hero):
        damage = randint(hero.strength - 5, hero.strength + 5)
        self.blood -= damage
        print(f'{self.name}{hero.name}攻击, 受到了{damage}点伤害!, 还剩{self.blood}滴血..')
        if self.blood <= 0:
            print(f'{self.name}{hero.name}杀死了')
            return True
        else:
            return False

测试

# 导入
from hero import Hero
from monster import Montser
if __name__ == '__main__':
    h1 = Hero("鲁班", 1000, 300)
    m1 = Montser("大龙", 5000, 50)
    while True:
        is_moster_died = m1.take_damage(h1)
        if is_moster_died:
            break
        is_hero_died = h1.take_damage(m1)
        if is_hero_died:
            break

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值