# day 4
# 类中成员变量描述对象的属性值根据对象不同,会产生区别,称此类变量为实例变量
# 类中成员变量描述对象的属性值根据对象不同,会产生区别,称此类变量为类变量
#
# class QieZi:
# sub = "people"
#
# def __init__(self):
# """构造方法,可以自定义参数,类似于c++的构造函数"""
# self.type = "茄子少将" # 共有属性,类似public
# # 实例变量
# self.name = None # 不给值
# self.__dnmd = None # 私有变量的定义格式
#
# # 成员方法
# def get_dnmd(self):
# """私有变量的封装 :访问器"""
# return __dnmd
#
# def set_dnmd(self, member):
# """私有变量的封装 :修改器"""
# self.__dnmd = member
#
# def speak(self):
# print("wdnmd!")
#
# def talk(self, i):
# j = 0
# while j < i:
# print("我叼你妈的!")
# j += 1
#
# def introduce(self):
# """ 想要在方法中调用类型的公共变量得加一个self"""
# print("我是%s,我叫%s,我喜欢说”%s“" % (self.type, self.name, self.words))
#
# def __WDNMD(self):
# """私有方法的定义"""
# return " "
#
# def __str__(self): # 魔术方法,在打印输出对象到屏幕时运行
# return "叼你妈的,还想看老子内存"
"""
类方法
定义格式:
class 类名:
@classmethod
def 方法名(cls,形参):
方法体
调用格式:
类名.方法名(实参)
对象名.方法名(实参)
NOTE:
实例方法可以调用类方法(变量)
类方法不可以调用实例方法(变量)
小结:类很高贵,实例不配
实例是类的舔狗
"""
#
# #############
"""
静态方法
定义格式:
class 类名:
@staticmethod
def 方法名(形参):
方法体
和类没啥关系,和普通函数没区别
"""
# 类的继承
"""
定义格式:
class 类名(父类)
pass
NOTE:
子类不能调用父类的私有成员
子类可以添加父类没有的成员
"""
# 类的多态继承
"""
定义格式:
class 类名(父类1,父类2,....)
pass、
父类在前面先被调用
多继承重写
调用格式:
1.父类名.方法名(对象)
2.spuer(本类名,对象).方法名
3.supper().方法名()
"""
# 例如
# class Animal:
# """父类:动物类"""
#
# def __init__(self):
# self.name = None
# self.age = None
# self.__we = None # 私有变量,子类无法继承
#
# def Speak(self):
# """
# 用来说话
# """
# print("我叼你妈的")
#
# pass
#
#
# class Cat(Animal):
# """子类:猫类"""
# def Speak(self):
# """重写"""
# print("我柜子动了")
# """
# 在子类中调用父类中被重写的实例方法
# 调用格式:
# 1.父类名.方法名(对象)
# 2.spuer(本类名,对象).方法名
# 3.supper().方法名()
# """
# Animal.Speak(self)
# super(Cat, self).Speak()
# super().Speak()
#
# pass
#
#
# cat = Cat()
# cat.name = "是我,你蝶"
# cat.age = 333
# # TODO 用于查看继承层次关系,object是所有类的父类
# print(Cat.__mro__)
# """
# 在子类中可以定义与父类相同名称的方法,此时子类的方法对父类的方法构成了重写
# """
# cat.Speak()
"""
案例:”反恐精英“程序
要求:
三个恐怖分子与反恐精英枪战
没人设定100生命值,生命值为0视为死亡
一方全部死亡枪战结束
以对象体现:
两个类
抽取人 类:有100血
枪战做成方法
"""
"""
信息显示模式:
"""
# 随机数
# random
"""
1.先导入包 import random
2.random.randint(1,3)
"""
import random
class Person:
def __init__(self, name):
self.name = name
self.life = 100
def __str__(self):
"""用于显示状态"""
return "%s当前的生命值为:%s" % (self.name, self.life)
class Hero(Person):
def fire(self, p):
damage = 40
# 加入命中率
hit = random.randint(1, 100)
if hit >= 20:
print("%s向%s开枪,造成了 %d伤害" % (self.name, p.name, damage))
p.life = p.life - damage
if p.life <= 0:
p.life = 0
else:
print("wdnmd,没打中" )
def __str__(self):
"""用于显示状态"""
state = ""
if self.life == 100:
state = "无伤"
elif self.life >= 70 and self.life < 100:
state = "轻伤"
elif 1 <= self.life < 100:
state = "重伤"
elif self.life == 0:
state = "没了"
return "%s当前的状态为:%s" % (self.name, state)
class IS(Person):
def fire(self, p):
damage = 5
hit = random.randint(1, 100)
if hit >= 40:
print("%s向%s开枪,造成了 %d伤害" % (self.name, p.name, damage))
p.life = p.life - damage
if p.life <= 0:
p.life = 0
else:
print("%s:芽儿哟,没打中" %self.name)
def main():
h = Hero("茂名磨刀石")
is1 = IS("磨刀人")
is2 = IS("pdd")
is3 = IS("lbw")
while True:
#产生随机数
x = random.randint(1, 3)
if x == 1:
h.fire(is1)
elif x == 2:
h.fire(is2)
elif x == 3:
h.fire(is3)
is1.fire(h)
is2.fire(h)
is3.fire(h)
print(h)
print(is1)
print(is2)
print(is3)
print()
#设置结束条件
if h.life <= 0:
print("%s死亡,枪战结束" %h.name)
break
if is1.life <= 0 and is2.life <= 0 and is3.life <= 0:
print("%s死亡,枪战结束" % is1.name)
break
main()