类变量和实例变量
注意事项
类和实例都可以访问 类变量,但是实例只能访问,无法修改,一旦修改了,则会生成一个同名的实例变量,而非本身的类变量。
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
22class 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
21public 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/类变量和实例变量/