一、类变量与实例变量的区别
在Python中,类是一组对象的属性和方法的集合。类变量是指由类定义的变量,可被该类的所有实例访问,作用于整个类。而实例变量是指每个类实例都拥有的变量,作用于实例本身。具体来说:
1、类变量定义方式: 类变量定义在类的内部,方法之外。定义时,直接使用类名.类变量名 = 初值
class MyClass:
class_var = 0 # 这是类变量
def __init__(self, var):
self.ins_var = var # 这是实例变量
2、类变量修改方式: 如果某个实例对类变量进行修改,则会创造出一个实例变量。
class MyClass:
class_var = 0
def __init__(self, var):
self.ins_var = var
MyClass.class_var += 1 # 对类变量进行修改
obj1 = MyClass('a')
obj2 = MyClass('b')
print(obj1.class_var) # 输出:2
print(obj2.class_var) # 输出:2
这是因为,当实例 obj1 对类变量 class_var 进行更改后,class_var 变量将不再是 MyClass 类对象的属性,而是 obj1 实例对象的属性。实例变量 ins_var 对于每个实例是独立的,但类变量 class_var 是整个类的属性,是所有实例共享的。
二、类变量的应用场景
在Python中,类变量被广泛应用于各种场景,以下是几个常见的场景:
1、计数器
可以利用类变量来实现对实例创建的计数功能。
class Counter:
count = 0
def __init__(self):
Counter.count += 1 # 计数器加1
self.id = Counter.count # 记录实例id
c1 = Counter()
c2 = Counter()
print(c1.id) # 输出:1
print(c2.id) # 输出:2
2、全局信息存储
可以利用类变量来存储全局信息,例如日志管理器。
class Logger:
logs = []
def __init__(self, log):
Logger.logs.append(log) # 将日志存到logs类变量中
l1 = Logger('first log')
l2 = Logger('second log')
print(Logger.logs) # 输出:['first log', 'second log']
3、类别名
可以利用类变量来实现类别名功能。即,将一个类的名字作为变量,供程序内其他部分使用。
class Person:
pass
class Student(Person):
pass
p = Person()
s = Student()
PersonClass = Person # 将Person类别名为PersonClass
print(isinstance(p, PersonClass)) # 输出:True
print(isinstance(s, PersonClass)) # 输出:True
三、类变量的注意事项
在使用类变量时,需要注意以下几点:
1、类变量的修改
当实例对类变量进行修改时,它会创建一个与类变量同名、不同id的实例变量,而不是修改类变量本身。因此,在修改类变量时应该使用类名进行操作。
class MyClass:
class_var = 1
def modify_class_var(self):
MyClass.class_var += 1 # 正确的修改方式
# self.class_var += 1 这是错误的写法,会创建实例变量
obj = MyClass()
obj.modify_class_var()
print(MyClass.class_var) # 输出:2
2、类变量的可变性
如果类变量是可变对象(如列表、字典等),则所有实例都共享一份可变对象,即修改其中一个实例的变量将会影响所有实例。
class MyClass:
class_var = []
def modify_class_var(self, val):
MyClass.class_var.append(val)
obj1 = MyClass()
obj2 = MyClass()
obj1.modify_class_var('a')
obj2.modify_class_var('b')
print(MyClass.class_var) # 输出:['a', 'b']
3、类变量的创建时间
类变量是在类定义时创建的,而不是在实例创建时。如果在类变量的定义或初始化过程中使用实例变量,则可能会产生意想不到的结果。
class MyClass:
class_var = []
def __init__(self, var):
self.ins_var = var
MyClass.class_var.append(self.ins_var) # 可能会产生意想不到的结果
obj1 = MyClass('a')
print(MyClass.class_var) # 输出:['a']
obj2 = MyClass('b')
print(MyClass.class_var) # 输出:['a', 'b']
四、总结
Python中的类变量是指由类定义的变量,它们可以被该类的所有实例访问,作用于整个类。类变量具有很多应用场景,如计数器、全局信息存储、类别名等。需要注意的是,类变量的修改方式、可变性、创建时间等方面会带来一些陷阱,需要在实际应用中仔细考虑。正确地使用类变量能够帮助我们开发出更为健壮的Python程序。
原创文章,作者:CWZLL,如若转载,请注明出处:https://www.506064.com/n/368370.html
微信扫一扫
支付宝扫一扫