Python 面向对象6: 类属性、类方法、静态方法

一、总体目录

  • 1.1、类的结构
  • 1.2、类属性和实例属性
  • 1.3、类方法和静态方法

二、类的结构

  • 2.1、术语 -实例

    • 使用面相对象开发,第 1 步 是设计 类

    • 使用 类名() 创建对象,创建对象 的动作有两步:

      • (1) 在内存中为对象 分配空间

      • (2) 调用初始化方法 __init__ 为 对象初始化
        对象创建后,内存 中就有了一个对象的 实实在在 的存在 — 实例

        • 创建出来的 对象 叫做 类 的 实例
        • 创建对象的 动作 叫做 实例化
        • 对象的属性 叫做 实例属性
        • 对象调用的方法 叫做 实例方法
    • 在程序执行时

      • 对象各自拥有自己的 实例属性
      • 调用对象方法,可以通过 self.

    结论

    • 每一个对象 都有自己 独立的内存空间,保存各自不同的属性
    • 多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用 传递到方法内部
  • 2.2 类是一个特殊的对象

    Python 中 一切皆对象:

    • class AAA: 定义的类属于 类对象
    • obj1 = AAA() 属于 实例对象
    • 在程序运行时, 同样 会被加载到内存

    • 在 Python 中, 是一个特殊的对象 —— 类对象

    • 在程序运行时,类对象 在内存中 只有一份,使用 一个类 可以创建出 很多个对象实例

    • 除了封装 实例属性方法外,类对象 还可以拥有自己的 属性方法

      • 类属性
      • 类方法
      • 通过 类名. 的方式可以 访问类的属性 或者 调用类的方法
        类的结构示意图

三、类属性 和 实例属性

  • 3.1 概念和使用

    • 类属性 就是给 类对象 中定义的 属性

    • 通常用来记录 与这个类相关 的特征

    • 类属性 不会用于记录 具体对象的特征

    • 如下例子,定义一个 类属性 count,记录创建类的个数

      class Tool(object):
            # 使用赋值语句,定义类属性,记录创建工具对象的总数
            count = 0
      
            def __init__(self,name):
                  # 针对类属性做一个计数+1
                  Tool.count += 1
                  self.name = name
      # 创建工具对象
      tool1 = Tool("斧头")
      tool2 = Tool("镰刀")
      # 知道使用 Tool 类到底创建了多少个对象?
      print("工具的数量是 %d"%Tool.count)
      
    • 类属性的创建:在类的下面使用赋值语句,等号左边是类属性的名字,右边是类属性的初始值 ;使用是:类名.属性名, 如上面的 count

  • 3.2、属性的获取机制- 向上查找机制

    • 在 Python 中 属性的获取 存在一个 向上查找机制(下面代码 Tool.count 与 tool2.count)

      class Tool(object):
            # 使用赋值语句,定义类属性,记录创建工具对象的总数
            count = 0
      
            def __init__(self,name):
                # 针对类属性做一个计数+1
                Tool.count += 1
                self.name = name
      # 创建 工具对象
      tool1 = Tool("斧头")
      tool2 = Tool("镰刀")
      # 知道使用 Tool 类到底创建了多少个对象?
      # print("工具的数量是 %d"%Tool.count) 
      print("工具的数量是 %d"% tool2.count)
      
    • 说明查找机制:首先上面的代码 tool2.count,tools这个对象是没有count 这个属性的,这时候就会去类的属性里面去找有没有 count,如果类里面也没有的话就报错

    • 由上面可知,要访问类属性有两种方式:

      • 类名.类属性
      • 对象.类属性 (不推荐)
    • 注意:如果使用 对象.类属性 = 值 赋值语句,只会 给对象添加一个属性,而不会影响到 类属性的值

      如上面的代码修改后(tool2.count就不靠谱了,仅仅是为 tool2添加了一个属性而已)

       # 创建 工具对象
       tool1 = Tool("斧头")
       tool2 = Tool("镰刀")
       # 知道使用 Tool 类到底创建了多少个对象?
       print("工具的数量是 %d"%Tool.count) 
       tool2.count = 100
       print("工具的数量是 %d"% tool2.count)
      

四、类方法 和 静态方法

  • 4.1、类方法

    • 类属性 就是针对 类对象 定义的属性

      • 使用 赋值语句class 关键字下方可以定义 类属性
      • 类属性 用于记录 与这个类相关 的特征
    • 类方法 就是针对 类对象 定义的方法

      • 类方法 内部可以直接访问 类属性 或者调用其他的 类方法
    • 语法如下

      @classmethod
            def 类方法名(cls):
                 pass
      
      • 类方法需要用 修饰器 @classmethod 来标识, 告诉解释器这是一个类方法
      • 类方法的 第一个参数 应该是 cls
        • 哪一个类 调用的方法,方法内的 cls 就是 哪一个类的引用
        • 这个参数和 实例方法 的第一个参数是 self 类似
        • 提示 使用其他名称也可以,不过习惯使用 cls
      • 通过 类名. 调用 类方法,调用方法时,不需要传递 cls 参数
      • 在方法内部
        • 可以通过 cls. 访问类的属性
        • 也可以通过 cls. 调用其他的类方法

      在类方法内部,可以直接使用 cls 访问 类属性 或者 `调用类方法

  • 4.2、类方法定义以及使用的案例

    需求:定义一个Person类,定义一个类属性:name,类方法:run 跑步,在类方法 run 里面打印类属性 name

    class Person(object):
    
           name = ""
          
          @classmethod
          def run(cls):
    
               print("%s 会跑"%cls.name)
    
    Person.name = "小米"
    Person.run()
    
  • 4.3、静态方法

    • 在开发时,如果需要在 中封装一个方法,这个方法:

      • 不需要 访问 实例属性 或者调用 实例方法
      • 不需要 访问 类属性 或者调用 类方法
    • 语法如下(不需要任何参数的)

      @staticmethod
      def 静态方法名():
            pass
      
    • 静态方法 需要用 修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法

    • 通过 类名. 调用 静态方法

    • 实例:

      class Baby(object):
      
          @staticmethod
          def cry():
      
              # 不需要访问实例属性也不需要访问类属性的方法
              print("小孩在哭...")
      Baby.cry()
      

五、综合案例

  • 5.1、需求

    • (1)、设计一个 Game 类,模拟 吃鸡游戏
    • (2)、属性:
      • 定义一个 类属性 top_score 记录游戏的 历史最高分
      • 定义一个 实例属性 player_name 记录 当前游戏的玩家姓名
    • (3)、方法:
      • 静态方法 show_help 显示游戏帮助信息
      • 类方法 show_top_score 显示历史最高分
      • 实例方法 start_game 开始当前玩家的游戏
    • (4)、主程序步骤
      • 查看帮助信息

      • 查看历史最高分

      • 创建游戏对象,开始游戏

        class Game(object):
        
             # 游戏最高分,类属性
             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("[%s] 开始游戏..." % self.player_name)
        
        # 使用类名.修改历史最高分
        Game.top_score = 10000
        
        # 1. 查看游戏帮助
        Game.show_help()
        
        # 2. 查看游戏最高分
        Game.show_top_score()
        
        # 3. 创建游戏对象,开始游戏
        game = Game("二郎神")
        
        game.start_game()
        
        # 4. 游戏结束,查看游戏最高分
        Game.show_top_score()
        
  • 5.2、总结

    • 实例方法 —— 方法内部需要访问 实例属性
      • 实例方法 内部可以使用 类名. 访问类属性
    • 类方法 —— 方法内部 需要访问 类属性
    • 静态方法 —— 方法内部,不需要访问 实例属性类属性
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容