类和对象
万物皆对象 分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地将对象进行进行分类
对象归类
类是抽象的概念,仅仅是模板 比如说:“人” 对象是一个你能够看得到、摸得着的具体实体: 赵本山,刘德华,赵丽颖
- 对象的特征——属性
属性——对象具有的各种特征。 每个对象的每个属性都拥有特定值。 例如:顾客张浩和李明的年龄、姓名不一样。 - 对象的特征——方法(操作,行为)
对象:用来描述客观事物的一个实体,由一组属性和方法构成
类型:狗
对象名:doudou
属性:
颜色:白色
方法:
叫,跑,吃
从对象抽象出“类”
是对象的模板, 对象是类的具体实例
name1 = "eric"
name2 = "Bob"
class Student(object):
def __init__(self):
self.id = None
self.name = None
self.score = None
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
def printInfo(self):
print(f'学号: {self.id} 姓名: {self.name} 分数: {self.score}')
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
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
s2 = Student(666, 'Bob', 24)
print(id(s2))
s2.printInfo()
s3 = Student(8888)
print(id(s3))
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
|