目录

  • 实例
  • 类属性
  • 示例
  • 属性获取机制
  • 类方法
  • 案例
  • 静态方法
  • 方法综合案例


实例

对象创建后, 内存中就有了一个对象的存在, 所以对象又叫做实例.
通常也把:
创建出来的 对象 叫做类的 实例
创建对象的 动作 叫做 实例化
对象的属性 叫做 实例属性
对象调用的方法 叫做 实例方法

类属性

类属性就是给类对象中定义的属性, 通常用来记录与这个类相关的特征, 类属性不会用于记录具体对象的特征

示例

需求 : 定义 一个工具类, 每件工具都有自己的name, 知道使用这个类, 创建了多少实例

class Tool():
    # 使用类属性count记录创建了多少实例
    count = 0

    def __init__(self, name):
        self.name = name

        Tool.count += 1

t2 = Tool("小小")
t3 = Tool("小大")
t4 = Tool("大小")
print(Tool.count)

属性获取机制

首先在对象内部查找对象属性, 没有找到就会向上寻找类属性
推荐的访问类属性的方式 : 类名.类属性

类方法

类方法 就是针对 类对象 定义的方法, 在 类方法 内部可以直接访问 类属性 或者调用 其他的 类方法

@classmethod
def 类方法名(cls):
	pass

语法介绍

类方法需要用修饰器 @classmethod 来标识, 告诉解释器这是一个类方法.
类方法的 第一个参数 应该是 cls
哪一个类 调用的方法, 方法内的 cls 就是 哪一个类的引用
通过 类名. 调用 类方法, 调用方法时, 不需要传递cls参数
方法内部, 可以通过cls. 访问类的属性, 也可以通过 cls. 调用其他的类方法

案例

需求
定义一个 工具类
每个工具都有自己的name
在类 封装一个 show_tool_count 的类方法, 输出是会用当前这个类, 创建的对象个数

class Tool():
    # 使用类属性count记录创建了多少实例
    count = 0

    def __init__(self, name):
        self.name = name
        Tool.count += 1

    @classmethod
    def show_tool_count(cls):
        print("总共创建了 %d 个工具类" % cls.count)


t2 = Tool("小小")
t3 = Tool("小大")
t4 = Tool("大小")
Tool.show_tool_count()

静态方法

静态方法 : 既 不需要 访问 实例属性 或者调用 实例方法; 也 不需要 访问 类属性 或者调用 类方法
语法 :

@staticmethod
def 静态方法名():
	pass

使用 类名. 调用 静态方法

class Dog():
    # 使用类属性count记录创建了多少实例
    count = 0

    def __init__(self, name):
        self.name = name
        Dog.count += 1

    @staticmethod
    def run():
        # 不需要访问实例属性,也不需要访问类属性的方法
        print("狗在跑")


t2 = Dog("小小")
print(Dog.count)
Dog.run()

方法综合案例

需求 :

  1. 设计一个Game类
  2. 定义一个类属性记录游戏历史最高分
  3. 定义一个实例属性palyer_name记录当前游戏的玩家姓名
  4. 静态方法显示游戏帮助信息
  5. 类方法显示历史最高分
  6. 实例方法开始当前玩家的游戏
class Game:
    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_game(self):
        print("%s注意, 游戏开始...." % self.player_name)

Game.show_help()
g = Game("小明")
g.start_game()
Game.show_top_score()