Python面向对象之类属性类方法静态技巧
发布时间:2021-11-12 11:23:06 所属栏目:教程 来源:互联网
导读:类的结构 实例 使用面向对象开发时,第一步是设计类; 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象; 2.为对象的属性 设置初始值--初始化方法(init); 对象创建后,内存中就有了一个对象的实实在在的存在--实例; 因
类的结构 实例 使用面向对象开发时,第一步是设计类; 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象; 2.为对象的属性 设置初始值--初始化方法(init); 对象创建后,内存中就有了一个对象的实实在在的存在--实例; 因此通常也会把: 1.创建出来的对象叫做类的实例; 2.创建对象的动作叫实例化; 3.对象的属性叫实例属性; 4.对象调用的方法叫实例方法; 在程序执行时: 1.对象各自拥有自己的实例属性; 2.调用对象方法,可以通过self. 访问自己的属性/调用自己的方法; 结论: 1.每一个对象都有自己的内存空间,保存各自不同的属性; 2.多个对象的方法,在内存中只有一份,在调用方法的时候,需要把对象的引用传递到方法内部; 类是一个特殊的对象 Python中,一切皆对象: class AAA: 定义的类属于类对象; obj1 = AAA() 属于实例对象; •程序运行时,类同样会被加载到内存中; •在Python中,类是一个特殊的对象--类对象; •在程序运行时,类对象在内存中只有一个,使用一个类可以创建出很多对象实例; •除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法--类属性;类方法; •通过类名. 的方式可以访问类的属性或者调用类的方法; 代码分层为: 1.类属性 2.类方法(cls) 3.__init__定义实例属性 4.实例方法(self) 类属性和实例属性 类属性的定义及使用 类属性就是给类对象定义的属性; 通常用来记录与这个类相关的特征; 类属性不会用于记录具体对象的特征; 定义一个植物类,每新添一种植物就让植物类计数+1 class Plant(object): # 使用赋值语句定义类属性,记录所有植物对象的数量 count = 0 def __init__(self, name): self.name = name # 每初始化一次,就让类属性的值+1 Plant.count += 1 # 创建植物对象 duorou = Plant("多肉") print("目前已养植物种类数量:", Plant.count) # 目前已养植物种类数量: 1 luhui = Plant("芦荟") yingtao = Plant("樱桃") # 输出植物对象的总数 print("目前已养植物种类数量:", Plant.count) # 目前已养植物种类数量: 3 属性的查找机制-向上查找 在python中 属性的获取存在一个向上查找机制: 1.首先在对象内部查找对象属性; 2.没有找到就会向上查找类属性; 因此,要访问类属性有两种方式: 1.类名.类属性 2.对象.类属性(不推荐) 注意:如果使用 对象.类属性=值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值; 可以用 对象.类属性 查看类属性,但不能用 对象.类属性=值 给它赋值; 如果使用 对象.类属性=值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值; 类方法和静态方法 类方法 类方法概念和定义语法 类属性 就是针对类对象定义的属性; 使用赋值语句在关键字class下面可以定义类属性; 类属性用来记录与这个类相关的特征; 类方法 就是针对类对象定义的方法; 在类方法内部可以直接调用类属性或者其他的类方法; 类方法定义语法如下: @classmethod def 类方法名(cls): pass 类方法需要@classmethod来进行修饰,告诉解释器这是一个类方法; 类方法的第一个参数应该是cls; 由哪一个类调用的类方法,方法内部的cls就是哪一个类的引用; 这个参数和实例方法的第一个参数是self类似; 使用其他名称也可以,但一般习惯使用cls; 通过 类名. 调用类方法,调用类方法时,不需要传递cls参数; 在方法内部, 可以通过 cls. 调用类属性; 通过 cls. 也可以调用其他类的方法; 在类方法内部可以直接使用cls 访问类属性或者其他的类方法; 类方法案例演示 class Plant(object): # 使用赋值语句定义类属性,记录所有植物对象的数量 count = 0 # 定义一个类方法 @classmethod def show_count(cls): print("目前已养植物种类数量:", Plant.count) def __init__(self, name): self.name = name Plant.count += 1 duorou = Plant("多肉") luhui = Plant("芦荟") # 调用类方法 Plant.show_count() # 目前已养植物种类数量: 2 静态方法 静态方法概念和语法 在开发时,如果需要在类中定义一个方法,这个方法: 既不需要访问实例属性也不需要调用实例方法; 既不需要访问类属性也不需要调用类方法; 这个时候,就可以把这个方法封装成静态方法; 静态方法语法如下: @staticmethod def 静态方法名(): pass 静态方法需要修饰器 @staticmethod 来表示,告诉解释器这是一个静态方法; 通过 类名. 调用静态方法; 静态方法示例 class Dog(object): @staticmethod def run(): # 不需要访问类属性和实例属性的方法,就可以定义一个静态方法 print("跳着跑") def __init__(self, name): self.name = name def bark(self): pass # 通过 类名. 调用静态方法,不需要创建对象 Dog.run() 方法综合案例 案例需求: 1.设计一个Game类 2.属性: 定义一个类属性top_score记录游戏最高分 定义一个实例属性palyer记录游戏玩家名字 3.方法: 静态方法show_help查看游戏帮助信息; 类方法show_topscore显示游戏最高分; 实例方法start_game开始当前玩家的游戏 4.主程序步骤 查看帮助信息 查看历史最高分 创建游戏对象,开始游戏 案例分析: 历史最高成绩--类属性 玩家姓名--实例属性 显示玩法--静态方法 显示历史最高成绩--类方法 进入游戏--实例方法 综合案例演练 同时使用类属性,实例属性,静态方法,类方法,实例方法; class Game(object): top_score = 0 @staticmethod def game_help(): print("游戏帮助信息") @classmethod def show_topscore(cls): print("历史最高分数是:", cls.top_score) def __init__(self, name): self.name = name def play_game(self): print("%s 开始游戏了" % self.name) # 查看游戏帮助文档 Game.game_help() # 查看历史最高分 Game.show_topscore() # 创建游戏对象 xiaoming = Game("小明") # 进入游戏 xiaoming.play_game() # 游戏帮助信息 # 历史最高分数是: 0 # 小明 开始游戏了 案例小结: 1.实例方法--方法内部需要访问实例属性;方法内部可以使用 类名. 查看类属性; 2.类方法--方法内部只需要访问类属性; 3.静态方法--方法内部既不需要访问类属性也不需要访问静态属性; 提示:当一个方法内急需要访问实例属性也需要访问类属性时,应该使用示例方法;因为类只有一个,实例方法内部可以使用 类名. 查看类属性; ![]() (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |