您的位置:

Python类变量的详解

一、类变量与实例变量的区别

在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程序。