Python学习笔记(二十四)
类方法和静态方法
类方法
类属性就是针对类对象定义的属性
使用赋值语句在class关键字下方可以定义类属性
类属性用于记录与整个类相关的特征
类方法就是针对类对象定义的方法
在类方法内部可以直接访问类属性或者调用其他的类方法
语法如下
@classmethod
def 类方法名(cls)
pass
类方法需要用哪个修饰器@classmethod来标识,告诉解释器这是一个类方法
类方法的第一个参数应该cls
由哪一个类调用的方法,方法内的cls就是哪一个类的引用
这个参数和实例方法的第一个参数是self类似
提示使用其他名称也可以,不过习惯用cls
通过类名.调用类方法,调用方法时,不需要传递cls参数
在方法内部
可以通过cls。访问类的属性
也可以通过cls,调用其他的类方法
在类方法内部,可以直接使用cls 访问类属性或者调用类方法
静态方法
在开发时,如果需要在类中封装一个方法,这个方法
既不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
这个时候,可以把这个方法封装成一个静态方法
语法如下
@staticmethod
def 静态方法名():
pass
静态方法需要用修饰器@staticmethod 来标识,告诉解释器这是一个静态方法
通过类名.调用 静态方法
类方法综合案例
需求
1、设计一个Game类
2、属性
定义一个类属性top_score记录游戏的历史最高分
定义一个实例属性player_name记录当前游戏的玩家姓名
3、方法
静态方法 show_help显示游戏帮助信息
类方法show_top_score显示历史最高分
实例方法start_game 开始当前玩家的游戏
4、主程序步骤
1、查看帮助信息
2、查看历史最高分
3、创建云游戏对象,开始游戏
class Game(object): top_score = 0 def __init__(self, player_name): self.player_name = player_name @classmethod def show_top_score(cls): print("玩家的历史最高分:%d" % cls.top_score) @staticmethod def show_help(): print("帮助信息: 让僵尸进入大门") def start_game(self): print("%s 开始游戏拉" % self.player_name) Game.show_help() Game.show_top_score() game = Game("小明") game.start_game()
案例小结
1、实例方法 -- 方法内部需要访问实例属性
实例方法内部可以使用类名.访问类属性
2、类方法--方法内部只需要访问类属性
3、静态方法 -- 方法内部,不需要访问实例属性和类属性
提问:
如果方法内部即需要访问实例属性,又需要访问类属性,应该定义成什么方法
答案
应该定义实例方法
因为,类只有一个,在实例方法内部可以使用类名.访问类属性
单例
单例设计模式
设计模式
设计模式是前人工作的总结和提炼,通常,被人们广泛流程的设计模式都是针对某一特定问题的成熟的解决方案
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
单例设计模式
目的 -- 让类创建的对象,在系统中只有唯一的一个实例
每一次执行类名()返回的对象,内存地址是相同的
单例设计模式的应用场景
1、音乐播放对象
2、回收站对象
3、打印机对象
_new_方法
使用类名()创建对象时,python的解释器首先会调用_new_方法为对象分配空间
_new_是一个有Object基类提供的内置的静态方法,主要作用有两个:
1、在内存中为对象分配空间
2、返回对象的引用
python的解释器获得对象的饮用后,将引用作为第一个参数,传递给_init_方法
重写_new_方法的代码非常固定
重写_new_方法一定要return super()._new_(cls)
否则Python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
注意:_new_是一个静态方法,在调用时需要主动传递cls参数
python中的单例
单例 -- 让类创建的对象,在系统中只有唯一的一个实例
1、定义一个类属性,初始值是None,用于,用于记录单例对象的引用
2、重写_new_方法
3、如果类属性is None ,调用父类方法分配空间,并在类属性中记录结果
4、返回类属性中记录的对象引用
class MusicPlayer(object): instance = None def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance player1 = MusicPlayer() print(player1) player2 = MusicPlayer() print(player2)