你是不是也曾困惑: 当Python中需要一个与类相关的功能时,何时该用类属性、何时用类方法、又何时用静态方法?比如,想统计一个类创建了多少个对象,是该定义在类里、对象里,还是完全独立?
类属性就是 类对象中定义的属性,它被该类的所有实例对象所共有。通常用来记录 与这类相关 的特征,类属性 不会用于记录 具体对象的特征。
在Python中,一切皆对象。类也是一个特殊的对象,我们可以单独为类定义属性。
class Person(object): # 定义类属性 count = 0 def __init__(self, name, age): self.name = name self.age = agep1 = Person('Tom', 23)p2 = Person('Harry', 26)
定义count类属性,用于记录实例化Person类,产生对象的数量。
class Person(object): # 定义类属性count count = 0 # 定义一个__init__魔术方法,用于进行初始化操作 def __init__(self, name): self.name = name # 对count类属性进行+1操作,用于记录这个Person类一共生成了多少个对象 Person.count += 1# 实例化对象p1p1 = Person('Tom')p2 = Person('Harry')p3 = Person('Ben')# 在类外部输出类属性print(f'我们共使用Person类生成了{Person.count}个实例对象')
为什么需要类方法,在面向对象中,特别强调数据封装性。所以不建议直接在类的外部对属性进行直接设置和获取。所以我们如果想操作类属性,建议使用类方法。
基本语法:
@classmethoddef 类名称(cls): pass
类方法需要用修饰器" @classmethod "来标识,告诉解释器这是一个类方法类方法的第一个参数应该是" cls "。
① 有哪一个类调用的方法,方法内的" cls "就是哪一个类的引用。
② 这个参数和示例方法的第一个参数是"self"类似。
③ 提示使用其他名称也可以,不过习惯使用" cls " 通过类名.调用类方法,调用方法时,不需要传递" cls "参数。
在方法内部① 可以通过"cls."访问类的属性 ② 也可以通过 "cls." 调用其他的类方法。
class Tool(object): # 定义一个类属性count count = 0 # 定义一个__init__初始化方法 def __init__(self, name): self.name = name Tool.count += 1 # 封装一个类方法,专门实现对Tool.count类属性进行操作 @classmethod def get_count(cls): print(f'我们使用Tool类共实例化了{cls.count}个工具')t1 = Tool('斧头')t2 = Tool('榔头')t3 = Tool('铁锹')Tool.get_count()
在开发时,如果需要在类中封装一个方法,这个方法:
① 既 不需要访问实例属性或者调用实例方法
② 也 不需要访问类属性或者调用类方法
这个时候,可以把这个方法封装成一个静态方法
基本语法:
@staticmethoddef 静态方法名(): pass
# 开发一款游戏class Game(object): # 开始游戏,打印游戏功能菜单 @staticmethod def menu(): print('1、开始游戏') print('2、游戏暂停') print('3、退出游戏')# 开始游戏、打印菜单Game.menu()
今日学习完毕,课后作业:
设计一个Game类
(1)属性:
① 定义一个类属性top_score记录游戏的历史最高分
② 定义一个实例属性player_name记录当前游戏的玩家姓名
(2)方法:
① 静态方法show_help显示游戏帮助信息
② 类方法show_top_score显示历史最高分
③ 实例方法start_game开始当前玩家的游戏