Python语言面向对象概念之实例、类对象、类属性、类方法、静态方法

实用主义学Python(小白也容易上手的Python实用案例)


文章目录

  • 一、实例
  • 二、类对象
    • 1. 概念简介
    • 2. 定义使用
  • 三、类方法
    • 1. 概念简介
    • 2. 定义使用
  • 四、静态方法
    • 1. 概念简介
    • 2. 定义使用
  • 五、方法综合案例
    • 1. 案例需求
    • 2. 代码实现
  • 五、参考资料

一、实例

  1. 使用面向对象方式进行程序开发,首先是设计
  2. 其次是使用**类名()**创建对象,而创建对象又分为两步:
    (1)使用__new__()方法在内存中为对象分配空间;
    (2)调用初始化方法__init__()为对象初始化
  3. 对象创建后,内存中就有了一个对象的实实在在的存在,即实例

因此,通常也会把:

  1. 创建出来的对象叫做类的实例
  2. 创建对象的动作叫做实例化
  3. 对象的属性叫做实例属性
  4. 对象调用的方法叫做实例方法

结论:

  • 每一个对象都有自己独立的内存空间,保存各自不同的实例属性
  • 多个对象的方法,在内存中只有一份,在调用实例方法时,需要把对象的引用传递给实例方法。

二、类对象

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. 代码实现

对照下列类图,有如下代码:
Python语言面向对象概念之实例、类对象、类属性、类方法、静态方法_第1张图片

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()

五、参考资料

本文主要参考网络教程。

你可能感兴趣的:(#,语法学习)