一、类属性与类方法
在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 以便访问当前实例的属性或方法。