Python中通过类名和cls修改类变量的值及注意事项
本文深入解析Python中类变量与实例变量的区别,重点讲解如何利用@classmethod和cls参数通过类名直接修改类变量的值。文章指出,通过实例对象修改类变量会创建同名实例变量,而通过cls或类名修改则会影响所有实例。同时提供了完整的代码示例,演示了类方法在模型加载等场景下的实际应用,并强调了类变量定义顺序的重要性。
- 若试图通过类的实例对象来修改类变量的值,实际上并未改变类变量本身,而是为该实例对象创建了两个新的实例变量(如name和age)。这种操作不会影响类中其他已实例化的对象,也不会对原本定义的类变量产生任何影响。
- 与类变量不同,实例变量仅能通过具体的类对象实例进行访问,无法直接通过类名来调用或访问。
- 若使用cls参数或类名来修改类变量的值,则会真正改变该同名的类变量,这一更改会立即反映在所有后续的实例化对象中。
通过类对象与类方法修改类变量的区别
class Person:
name='jerry'
age='20'
def __init__(self, name, age):
self.name = name
self.age = age
print("构造函数", name, age)
@classmethod
def A(cls):
# cls()等价于类Person(),
# 通过类对象p是无法修改类变量的
p=cls("Tom", 18)
print('cls:', cls, p)
return p
@classmethod
def B(cls):
# 类方法cls可以直接调用类变量
print("B结果:", cls.name, cls.age)
@classmethod
def C(cls):
# 类方法cls可以直接调用类变量
# cls和类名一样可修改类变量的值,会影响所有的实例化对象
cls.name="曹操"
cls.age=50
if __name__ == '__main__':
Person.B()
Person.C()
print("C方法修改后,类变量的值:", Person.name, Person.age)
# 可以使用类名直接调用类方法
person = Person.A()
print(person.name, person.age)
print("最终类变量的值:", Person.name, Person.age) D:\MC\venv\Scripts\python.exe D:/MC/test01.py运行B方法后的输出结果如下所示:
jerry 20
执行C方法并修改类变量后,类变量的当前值为:曹操 50。此时构造函数输出的Tom 18仍为初始状态。
cls: <class '__main__.Person'> <__main__.Person object at 0x000002362F849D00>
Tom 18最终确认类变量的值为:
曹操 50
Process finished with exit code 0类方法实现实例ID自增与模型加载应用
我对Man类进行了两次实例化操作,生成的每个实例拥有不同的内存地址(id不同)。这一功能是通过类方法实现的:首先使用@classmethod装饰器定义类方法,然后在方法内部使用“cls”关键字代表当前类本身。类方法对类属性进行的处理具备状态记忆功能。
需要特别注意:类方法所处理的变量必须为类变量。因为在类方法内部无法使用self来寻址实例变量,因此建议将类变量定义在代码的最前端,如上文示例中的“id=0”所示。虽然类变量可以通过self访问,但在__init__函数中无需再次对类变量进行描述。因此,在上述代码中,self.id并非必须存在。
对于需要动态改变类变量值的场景(例如每次调用id_number(cls)方法时,类变量id的值随之递增),可以高效利用此技巧进行模型加载。具体做法是将模型封装为一个类,将网络初始化和模型加载逻辑封装在类方法中。这样,每次执行load操作后,模型即可被持续复用。
class Man:
id = 0 # 类变量
def __init__(self, name):
self.name = name
self.id = self.id_number()
@classmethod
def id_number(cls):
# 类方法可以改变类属性,对类属性进行的处理是有记忆性的。
# 类方法处理的变量一定要是类变量。因为在类方法里你用不了self来寻址实例变量,
# 所以需要把类变量放到最前面描述,如上面的"id=0"所示。
cls.id += 1
cls.ww=2
return cls.id, cls.ww
a = Man('A')
print(a.id)
b = Man('B')
print(b.id)
c=Man.id_number()
print(c)D:\MC\venv\Scripts\python.exe D:/MC/test2.py
(1, 2)
(2, 2)
(3, 2)
Process finished with exit code 0至此,关于Python中通过类名和类方法cls修改类变量值的介绍已完成。如需了解更多相关Python修改类变量值的内容,建议搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













