P 面向对象 | 类的结构
2019-10-05 本文已影响0人
Ricsy

一、类
类是一个特殊的对象(类对象)
python中一切皆对象
eg:
- 定义的类属于类对象
- 创建的实例属于实例对象

1.1 类的结构
面向对象开发中
- 设计类
- 使用类名()创建对象
(1) 在内存中为对象分配空间
(2) 调用初始化方法__init__
——对象初始化 - 对象创建后,内存中就有一个对象的实实在在的存在——实例

- 每一个对象都有自己独立的内存空间,保存各自不同的属性
- 多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部
eg:
对象的引用self
,可以通过self.
访问自己的属性和调用自己的方法
概念 | 说明 |
---|---|
实例 | 类创建出来的对象叫做类的实例 |
实例化 | 类创建对象的动作叫做实例化 |
实例属性 | 对象的属性叫做实例属性 |
实例方法 | 对象调用的方法叫做实例方法 |
1.2 类属性和实例属性
概念 | 说明 |
---|---|
类属性 | 给类对象定义的属性 1. 通常用来记录与这个类相关的特征 2. 不会用于记录具体对象的特征 |
类方法 | 给类对象定义的方法 |
1.2.1 属性的获取机制

1.2.2 类属性访问方式
类名.类属性名
对象名.类属性名
不推荐
如果使用对象名.类属性名 = 值
的赋值语句,只会给对象增加一个属性,而不会影响到类属性的值,所以不推荐对象名.类属性名
eg:
class Tool:
# 类属性,用于记录工具对象的总数
count = 0
def __init__(self, name):
self.name = name
# 修改类属性
Tool.count += 1
if __name__ == '__main__':
tool1 = Tool('斧头')
tool2 = Tool('榔头')
tool3 = Tool('铁锹')
tool4 = Tool('筛子')
tool5 = Tool('梯子')
tool1.count = 99
print("工具对象的总个数:%s" % Tool.count)
print("工具对象的总个数:%s" % tool1.count)
print("tools对象count属性的值:%s" % tool1.count)
1.3 类方法和静态方法
概念 | 说明 |
---|---|
类属性 | 给类对象定义的属性 1. 通常用来记录与这个类相关的特征 2. 不会用于记录具体对象的特征 |
类方法 | 给类对象定义的方法 |
1.3.1 类方法
类方法可以直接访问类属性或调用其他的类方法
语法:
@classmethod
def 类方法名(cls):
pass
名称 | 说明 |
---|---|
self |
哪一个实例调用的方法就是那一个实例的引用 |
cls |
哪一个类调用的方法就是那一个类的引用 |
- 可以通过
cls.
访问类属性和调用其他的类方法
eg:
class Tool:
# 类属性,用于记录工具对象的总数
count = 0
def __init__(self, name):
self.name = name
# 修改类属性
Tool.count += 1
# 类方法,用于显示工具对象的总数
@classmethod
def show_tool_count(cls):
print("工具对象的总个数:%s" % cls.count)
if __name__ == '__main__':
tool1 = Tool('斧头')
tool2 = Tool('榔头')
tool3 = Tool('铁锹')
tool4 = Tool('筛子')
tool5 = Tool('梯子')
Tool.show_tool_count()
1.3.2 静态方法
静态方法既不需要访问类属性或调用类方法
静态方法也不需要访问实例属性或调用实例方法
语法:
@staticmethod
def 静态方法名():
pass
不需要创建对象,直接用类名.
来调用静态方法
eg:

class Game:
# 类属性,记录游戏历史最高分
top_score = 0
# 静态方法,显示游戏帮助信息
@staticmethod
def show_help():
print("帮助信息:让僵尸进入大门")
# 类方法,显示历史最高分
@classmethod
def show_top_score(cls):
print("历史最高分是:%d" % cls.top_score)
# 初始化
def __init__(self, player_name):
# 实例属性,记录当前游戏的玩家姓名
self.player_name = player_name
# 实例方法,开始当前玩家的游戏
def start_game(self):
print("开始游戏啦...")
# 测试主函数
if __name__ == '__main__':
xiaoming = Game('小明')
Game.show_help()
Game.show_top_score()
xiaoming.start_game()

更新中......