• Python 类属性、类方法、self、cls


    一、类属性与类方法


    在Python中,一切皆对象。

    class AAA:定义的类属于类对象——类也是特殊的对象!
    obj1 = AAA()属于实例对象
    类对象拥有自己的属性和方法。

    类属性


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

    class Weapon(object):
    count = 0 # 用来记录这个类创建了多少对象
    
    def __init__(self, name):
    self.name = name
    Weapon.count += 1 # 使用 类名.count 的方式访问
    
    
    wp1 = Weapon("刀枪剑戟")
    wp2 = Weapon("斧钺钩叉")
    wp2.count = 99 # 设置属性值而非读取
    print(Weapon.count) # 因此这里类属性依旧不变,值为2

    注意:使用类名.属性的方式访问类属性。

    类方法(@classmethod)


    语法:
    类方法前面需要用修饰器@classmethod告诉解释器这是一个类方法
    类方法的第一个参数应该是cls

    可以使用cls.访问类属性

    class AAA(object):
    @classmethod
    def func(cls):
    pass

    一个实例

    class Weapon(object):
    count = 0
    
    def __init__(self, name):
    self.name = name
    Weapon.count += 1
    
    @classmethod # 这里必须有修饰器,告诉解释器这是一个类方法
    def get_count(cls):
    return cls.count
    
    
    wp1 = Weapon("刀枪剑戟")
    wp2 = Weapon("斧钺钩叉")
    print(Weapon.get_count())


    二、静态方法(@staticmethod)



    需要使用修饰器@staticmethod让解释器知道这是静态方法
    作用与使用细节:

    如果一个方法只是起到输出固定信息等作用,则使用静态方法
    静态方法无需传递参数

    class AAA(object):
    @staticmethod
    def func():
    pass


    一个实例
    设计一款游戏,如下环节与对应方法

    记录游戏最高分——类属性
    记录当前玩家信息——实例属性
    输出版本信息、帮助——静态方法
    输出历史最高分——类方法
    开始当前玩家的游戏——实例方法


    Python中的 self 和 cls


    测试代码:

    class A(object):
    
    def __init__(self):
    self.name = "xiaoming"
    self.num = None
    
    def get_self(self):
    return self
    
    @classmethod
    def get_cls(cls):
    return cls
    
    def get_super(self):
    return super()
    
    
    cc = A()
    dd = A()
    print(cc.get_self() is dd.get_self()) # False 证明self是实例对象
    print(cc.get_cls() is dd.get_cls()) # True 证明同一类中cls只有一个,cls是类对象


    通过测试发现,无论创建了多少实例,它们的 self 均是不同的,而它们的 cls 总相同。

    名称 测试结果 结论
    self 无论创建了多少实例,它们的 self 均是不同的 self 为实例对象的引用
    cls 无论创建多少实例,cls 总相同 cls 为类对象的引用
    因此,当一个方法是类方法(使用@classmethod修饰)时,它需要传递参数 cls 以便访问类属性/方法;
    当一个方法是实例方法时,需要传递参数 self 以便访问当前实例的属性或方法。


    原文链接:https://blog.csdn.net/cprimesplus/article/details/87886030

  • 相关阅读:
    1020. Tree Traversals
    1001. A+B Format
    centos 各类无线网卡编译
    vim 详细配置 超全
    深夜复习strcpy函数原型竟然暗藏着这么多玄机
    第一篇博客
    strcat函数使用中出现的问题
    strcpy与strncpy工作方式及其区别
    strcpy与面试官
    linux下多线程编程
  • 原文地址:https://www.cnblogs.com/superbaby11/p/16166391.html
Copyright © 2020-2023  润新知