类变量和实例变量

注意事项

类和实例都可以访问 类变量,但是实例只能访问,无法修改,一旦修改了,则会生成一个同名的实例变量,而非本身的类变量。

1
2
3
4
5
6
7
8
9
10
class A(object):
a = 1 # 类变量

print(A.a) # 1
t = A()
print(t.a) # 1, 访问的是类变量

t.a = 4 # 生成一个实例变量,而非修改类变量
print(t.a) # 4
print(A.a) # 1

和JAVA的区别

对于实例变量,python和java没有区别,子类可以继承和修改,生成的都是新的变量,不影响父类。

对于类变量,python和java是不一样的:

  • python: 子类均可以继承和修改,一旦进行修改,实际子类会生成该类变量的副本,从那刻起,该对象读取和写入的都是自身持有的类变量的副本。所以这个角度看,类变量基本是和实例变量一样的,感觉写代码的时候用类变量或者实例变量都可以。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Parent(object):
    a = 1 # 类变量
    def __init__(self):
    self.a = 2 # 实例变量


    class Child(Parent):
    def __init__(self):
    super(Child, self).__init__()

    p = Parent()
    print(Parent.a) # 1, 类变量
    print(p.a) # 2, 实例变量

    c = Child()
    print(Child.a) # 1, 父类的类变量
    print(c.a) # 2, 父类的类变量

    Child.a = 11 # 生成子类的类变量
    c.a = 22 # 生成子类的实例变量
    print(Parent.a) # 1, 父类类变量不变
    print(p.a) # 2, 父类实例变量不变
  • Java: 类变量只可以被子类访问和修改,无法继承,也就是说子类是没有自己的类变量副本,即使修改了影响也是父类的类变量。所以在java中,类变量和成员变量是有明显不同的,类方法和成员方法也是类似道理,所以成员方法有多态,类方法是没有多态的(对象是谁的,就访问谁的类方法)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class Parent {
    public static int a = 1;
    }

    public class Child extends Parent {
    }


    public class test {

    public static void main(String[] args) {
    Parent p = new Parent();
    System.out.println(p.a); // 1, 父类类变量
    System.out.println(Parent.a); //1, 父类类变量

    Child c = new Child();
    c.a = 2; // 通过子类修改父类的类变量
    System.out.println(Parent.a); // 2, 父类类变量被修改
    }
    }


类变量和实例变量
http://yoursite.com/2021/06/25/编程开发/Python/类变量和实例变量/
作者
Wei Lyu
发布于
2021年6月25日
许可协议