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)

static:静态
需要使用修饰器@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 以便访问当前实例的属性或方法。

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值