类属性
类属性就是给类对象中定义的属性,通常用来记录与这个类相关的特征,类属性不会用于记录具体对象的特征。
示例
需求:
- 定义一个Animal类;
- 每个物种都有自己的名字;
- 查看通过这个类创建了多少个物种
代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Animal(object):
# 类属性
count = 0
def __init__(self, species):
self.species = species
Animal.count += 1
# 创建实例对象
dog = Animal("狗")
cat = Animal("猫")
pig = Animal("猪")
print(f"一共创建了 {pig.count} 个物种")
print(f"一共创建了 {Animal.count} 个物种")
pig.count = 10
print(f"一共创建了 {pig.count} 个物种")
print(f"一共创建了 {Animal.count} 个物种")
输出:
一共创建了 3 个物种
一共创建了 3 个物种
一共创建了 10 个物种
一共创建了 3 个物种
访问类属性的方式:
- 类名.类属性
- 对象.类属性(不推荐,这会造成在代码阅读时分不清要访问的是类的属性还是对象的属性)
当使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值
此时,Python解释器在执行赋值语句时并不会执行向上向上查找机制,当执行赋值语句 pig.count = 10 时,会在pig中找查找是否具有count属性,如果没有就会在对象pig(注意其他对象中并不会有count这个属性)中直接添加count属性并赋初值10。
因此,不推荐使用 对象.类属性 来访问类属性。
类方法和静态方法
类方法 就是针对类对象定义的方法。在类方法内部可以直接访问类属性或者调用其他的类方法。
Python使用装饰器 @classmethod 来定义一个类方法。
静态方法:
在开发时,如果需要在类中封装一个方法,且这个方法:
- 既不需要访问实例属性或者调用实例方法
- 也不需要访问类属性或者调用类方法
此时,我们可以使用静态方法。
Python使用装饰器 @staticmethod 来定义一个静态方法。
示例
需求:
- 设计一个游戏类;
- 属性:
2.1 定义一个 类属性:最高分
2.2 定义一个 实例属性:玩家姓名 - 方法:
3.1 静态方法:显示游戏帮助信息
3.2 类方法:显示历史最高分
3.3 实例方法:开始游戏
代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Game(object):
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
# 创建静态方法
@staticmethod
def show_help():
print("帮助信息:\r\n"
"1. ××××××\r\n"
"2. ××××××\r\n"
"3. ××××××")
# 创建类方法
@classmethod
def show_top_score(cls):
print(f"历史最高分是:{cls.top_score}")
def start_game(self):
print(f"{self.player_name} 开始游戏啦...")
# 查看游戏的帮助信息
Game.show_help()
# 查看历史最高分
Game.show_top_score()
# 创建游戏对象
xiaoming = Game("小明")
xiaoming.start_game()
输出:
帮助信息:
1. ××××××
2. ××××××
3. ××××××
历史最高分是:0
小明 开始游戏啦...
小结
-
实例方法 —— 方法内部需要访问 实例属性
实例方法 内部可以使用 类名. 访问 类属性
-
类方法 —— 方法内部 只 需要访问 类属性
-
静态方法 —— 方法内部,不需要访问 实例属性 和 类属性