因此,通常也会把:
创建出来的对象叫做类的实例; 创建对象的动作叫做实例化; 对象的属性叫做实例属性; 对象调用的方法叫做实例方法。结论:
每一个对象都有自己独立的内存空间,保存各自不同的实例属性; 多个对象的方法,在内存中只有一份,在调用实例方法时,需要把对象的引用传递给实例方法。 二、类对象 1. 概念简介在Python中,一切皆对象:
class AAA:语法定义的类为类对象; obj = AAA()语法创建实例对象。 程序运行时,类同样会被加载到内存中; 程序运行时,类对象在内存中只有一份,使用一个类可以创建出多个实例对象,且所有实例对象共用保存在类对象中的一份实例方法; 类对象可以拥有自己的属性和方法: 类属性 类方法 通过类名.的方式可以访问类的属性或者调用类的方法。 2. 定义使用 类属性是给类对象定义的属性; 类属性用来记录与这个类相关的特征; 类属性不会用于记录具体对象的特征。如下面代码实现这样的需求:
定义一个工具类; 每件工具都有name实例属性; 需要知道通过这个类创建了多少个工具对象。class Tool(object):
# 使用赋值语句定义类属性,记录所有工具对象的数量
count = 0
def __init__(self, name):
self.name = name
# 让类属性的值+1
Tool.count += 1
# 1. 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")
# 2.输出工具对象的总数
print(Tool.count)
对于Python中提供的用于访问类属性的机制,需要注意的是:
可以通过两种方式访问类属性: 类名.类属性 对象.类属性(这涉及所谓Python中的属性获取向上查找机制,即通过对象.属性未找到实例属性时,解释器会查到是否有同名类属性,但不推荐使用这种方式,原因如下)。 如果使用对象.类属性 = 值这样的语句,只会给对象添加一个属性,而不会影响到类属性的值。 三、类方法 1. 概念简介 类方法就是针对类对象定义的方法。在类方法内部可以直接访问类属性或者调用其他的类方法; 定义类方法需要使用装饰器@classmethod来标识,用以告诉解释器这是一个类方法; 类方法的第一个参数应该是cls,由哪一个类来调用类方法,方法内的cls就是哪一个类的引用,这个参数和实例方法中的第一个参数self类似。 2. 定义使用class Tool(object):
# 使用赋值语句定义类属性,记录所有工具对象的数量
count = 0
@classmethod
def show_tool_count(cls):
print("工具对象的数量%d" % cls.count)
def __init__(self, name):
self.name = name
# 让类属性的值+1
Tool.count += 1
# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
# 调用类方法
Tool.show_tool_count()
四、静态方法
1. 概念简介
如果需要在类中封装一个方法,但是这个方法,既不需要访问实例属性或者调用实例方法,又不需要访问类属性或者调用类方法,这个时候,可以把这个方法封装成一个静态方法。
定义静态方法需要通过装饰器@staticmethod来进行标识,且定义时既不需要指定self参数、也不需要指定cls参数,通过类名.静态方法名来调用静态方法。
2. 定义使用class Dog(object):
@staticmethod
def run():
# 不访问实例属性/类属性
print("小狗要跑...")
# 通过类名.调用静态方法 - 不需要创建对象
Dog.run()
五、方法综合案例
1. 案例需求
设计一个Game类;
Game类的属性情况为:
定义一个类属性top_score记录历史最高分;
定义一个实例属性player_name记录当前游戏的玩家姓名;
Game类的方法情况为:
静态方法show_help用来显示游戏帮助信息;
类方法show_top_score显示历史最高分;
实例方法start_game开始当前玩家的游戏。
主程序的步骤为:
查看帮助信息;
查看历史最高分;
创建游戏对象,开始游戏。
2. 代码实现
对照下列类图,有如下代码:
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_game(self):
print("%s开始游戏啦!" % self.player_name)
# 1.查看游戏帮助信息
Game.show_help()
# 2.查看历史最高分
Game.show_top_score()
# 3.创建游戏对象
gamer = Game("小明")
gamer.start_game()
五、参考资料
本文主要参考网络教程。