zoukankan      html  css  js  c++  java
  • Python面向对象之类属性类方法静态方法

    类的结构

    实例

    使用面向对象开发时,第一步是设计类;
    当使用 类名() 创建对象时,会自动执行以下操作:
    1.为对象在内存中分配空间--创建对象;
    2.为对象的属性 设置初始值--初始化方法(init);
    对象创建后,内存中就有了一个对象的实实在在的存在--实例

    因此通常也会把:
    1.创建出来的对象叫做类的实例;
    2.创建对象的动作叫实例化;
    3.对象的属性叫实例属性;
    4.对象调用的方法叫实例方法;

    在程序执行时:
    1.对象各自拥有自己的实例属性;
    2.调用对象方法,可以通过self. 访问自己的属性/调用自己的方法;

    结论:
    1.每一个对象都有自己的内存空间,保存各自不同的属性;
    2.多个对象的方法,在内存中只有一份,在调用方法的时候,需要把对象的引用传递到方法内部;

    类是一个特殊的对象

    Python中,一切皆对象:

    class AAA: 定义的类属于类对象;
    obj1 = AAA() 属于实例对象;
    
    • 程序运行时,类同样会被加载到内存中;
    • 在Python中,类是一个特殊的对象--类对象;
    • 在程序运行时,类对象在内存中只有一个,使用一个类可以创建出很多对象实例;
    • 除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法--类属性;类方法;
    • 通过类名. 的方式可以访问类的属性或者调用类的方法;

    代码分层为:
    1.类属性
    2.类方法(cls)
    3.__init__定义实例属性
    4.实例方法(self)

    类属性和实例属性

    类属性的定义及使用

    类属性就是给类对象定义的属性;
    通常用来记录与这个类相关的特征;
    类属性不会用于记录具体对象的特征;

    定义一个植物类,每新添一种植物就让植物类计数+1

    class Plant(object):
        # 使用赋值语句定义类属性,记录所有植物对象的数量
        count = 0
    
        def __init__(self, name):
            self.name = name
            # 每初始化一次,就让类属性的值+1
            Plant.count += 1
    
    
    # 创建植物对象
    duorou = Plant("多肉")
    print("目前已养植物种类数量:", Plant.count)  
    # 目前已养植物种类数量: 1
    
    luhui = Plant("芦荟")
    yingtao = Plant("樱桃")
    # 输出植物对象的总数
    print("目前已养植物种类数量:", Plant.count)  
    # 目前已养植物种类数量: 3
    

    属性的查找机制-向上查找

    在python中 属性的获取存在一个向上查找机制:
    1.首先在对象内部查找对象属性;
    2.没有找到就会向上查找类属性;

    因此,要访问类属性有两种方式
    1.类名.类属性
    2.对象.类属性(不推荐)

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

    可以用 对象.类属性 查看类属性,但不能用 对象.类属性=值 给它赋值;
    如果使用 对象.类属性=值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值;

    类方法和静态方法

    类方法

    类方法概念和定义语法

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

    类方法 就是针对类对象定义的方法;
    在类方法内部可以直接调用类属性或者其他的类方法;

    类方法定义语法如下:

    @classmethod
    def 类方法名(cls):
    	pass
    

    类方法需要@classmethod来进行修饰,告诉解释器这是一个类方法;
    类方法的第一个参数应该是cls;
    由哪一个类调用的类方法,方法内部的cls就是哪一个类的引用;
    这个参数和实例方法的第一个参数是self类似;
    使用其他名称也可以,但一般习惯使用cls;
    通过 类名. 调用类方法,调用类方法时,不需要传递cls参数;
    在方法内部,
    可以通过 cls. 调用类属性;
    通过 cls. 也可以调用其他类的方法;
    在类方法内部可以直接使用cls 访问类属性或者其他的类方法;

    类方法案例演示

    class Plant(object):
        # 使用赋值语句定义类属性,记录所有植物对象的数量
        count = 0
    
        # 定义一个类方法
        @classmethod
        def show_count(cls):
            print("目前已养植物种类数量:", Plant.count)
    
        def __init__(self, name):
            self.name = name
            Plant.count += 1
    
    
    duorou = Plant("多肉")
    luhui = Plant("芦荟")
    
    # 调用类方法
    Plant.show_count()  # 目前已养植物种类数量: 2
    

    静态方法

    静态方法概念和语法

    在开发时,如果需要在类中定义一个方法,这个方法:
    既不需要访问实例属性也不需要调用实例方法;
    既不需要访问类属性也不需要调用类方法;
    这个时候,就可以把这个方法封装成静态方法;

    静态方法语法如下:
    @staticmethod
    def 静态方法名():
    pass

    静态方法需要修饰器 @staticmethod 来表示,告诉解释器这是一个静态方法;
    通过 类名. 调用静态方法;

    静态方法示例

    class Dog(object):
        @staticmethod
        def run():
            # 不需要访问类属性和实例属性的方法,就可以定义一个静态方法
            print("跳着跑")
    
        def __init__(self, name):
            self.name = name
    
        def bark(self):
            pass
    
    
    # 通过 类名. 调用静态方法,不需要创建对象
    Dog.run()
    

    方法综合案例

    案例需求
    1.设计一个Game类
    2.属性:
    定义一个类属性top_score记录游戏最高分
    定义一个实例属性palyer记录游戏玩家名字
    3.方法:
    静态方法show_help查看游戏帮助信息;
    类方法show_topscore显示游戏最高分;
    实例方法start_game开始当前玩家的游戏
    4.主程序步骤
    查看帮助信息
    查看历史最高分
    创建游戏对象,开始游戏

    案例分析
    历史最高成绩--类属性
    玩家姓名--实例属性

    显示玩法--静态方法
    显示历史最高成绩--类方法
    进入游戏--实例方法

    综合案例演练
    同时使用类属性,实例属性,静态方法,类方法,实例方法;

    class Game(object):
        top_score = 0
        @staticmethod
        def game_help():
            print("游戏帮助信息")
        @classmethod
        def show_topscore(cls):
            print("历史最高分数是:", cls.top_score)
    
        def __init__(self, name):
            self.name = name
    
        def play_game(self):
            print("%s 开始游戏了" % self.name)
    
    
    # 查看游戏帮助文档
    Game.game_help()
    # 查看历史最高分
    Game.show_topscore()
    # 创建游戏对象
    xiaoming = Game("小明")
    # 进入游戏
    xiaoming.play_game()
    
    # 游戏帮助信息
    # 历史最高分数是: 0
    # 小明 开始游戏了
    

    案例小结
    1.实例方法--方法内部需要访问实例属性;方法内部可以使用 类名. 查看类属性;
    2.类方法--方法内部只需要访问类属性;
    3.静态方法--方法内部既不需要访问类属性也不需要访问静态属性;
    提示:当一个方法内急需要访问实例属性也需要访问类属性时,应该使用示例方法;因为类只有一个,实例方法内部可以使用 类名. 查看类属性;

  • 相关阅读:
    Python面向对象——内置对象的功能扩展
    学术日记#学术道德与人文素养
    Python面向对象——基本继承
    SqlServer——字符串处理函数
    SqlServer——索引
    生活小问题(1)
    win7-VS2010-IIS网站的发布问题
    PhoneGap+Cordova+SenchaTouch-01-环境搭建
    sql server数字转字符串出现科学计数法
    SQLServer 重启服务后,自增1的标识列一次增长了1000(转自博问)
  • 原文地址:https://www.cnblogs.com/yifchan/p/python-1-17.html
Copyright © 2011-2022 走看看