# 创建的对象叫做类的实例
# 创建对象的动作叫做实例方法
# 对象的属性叫做实例属性


# 类属性和实例属性
# 类属性:类对象中定义的属性
# 类属性通常记录这个类的相关特征
# 类属性不会记录具体对象的特征

class Tool(object):
    count = 0  # 记录工具类的数量(类属性的定义)
    def __init__(self,name):
        self.name = name
        Tool.count += 1  # 调用类属性格式:类名.属性名
    @classmethod  # 声明一个类方法
    def show_tool_count(cls): # 类方法里面是cls
        print("工具对象的数量 %d " % cls.count) #用cls可以直接调用类中的类变量
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("锯子")

print(Tool.count) # (调用类属性)

# 调用类方法:
Tool.show_tool_count()



# 静态方法
# 该方法不需要访问实例属性,或者调用实例方法,也不需要类属性或者调用类方法
# 在括号里不需要添加 self (实例方法)或者 cls (类方法)

class Dog(object):
    @staticmethod
    def run():
        print("小狗赶紧跑.....")

# 通过类名.静态方法的方式调用--- 不需要创建对象
Dog.run()

运行结果:

3
工具对象的数量 3 
小狗赶紧跑.....

综合案例:

# 案例:
# 属性1: 类属性 top_score :历史最高分(跟类有关,与每次的玩家无关)
# 属性2:实例属性 player_name 记录当前的游戏玩家姓名

# 方法1:show_help :显示游戏的帮助信息
# 方法2:show_top_score :显示历史最高分
# 方法3:start_game :开始当前玩家的游戏

# 主程序的步骤:
# 1.查看帮助信息
# 2.查看历史最高分
# 3.创建游戏对象,开始游戏

class Game(object):
    # 历史最高分
    top_score = 0
    def __init__(self,player_name):
        self.player_name = player_name
    @staticmethod  #静态方法
    def show_help():
        print("帮助信息,让僵尸进入大门")
    @classmethod  #类方法
    def show_top_score(cls):
        print("历史记录 %d" % cls.top_score)

    def start_gane(self): # 实例方法
        print("%s 开始游戏... " % self.player_name)

# 1.查看游戏的帮助信息,调用静态方法
Game.show_help()
# 2,.查看历史最高分,调用类方法
Game.show_top_score()
# 3.创建游戏对象,调用实例方法
game = Game("小明")
game.start_gane()

运行结果:

帮助信息,让僵尸进入大门
历史记录 0
小明 开始游戏...