• python 类变量


      在使用python之前一直是使用java的,对于java类中的变量概念比较牢固,所以在迁移到python中只有一直有一点云山雾绕的,在某段时间一直不敢在类中定义变量。一直到昨天深入的理解了一下python类变量的定义,终于有一些理解。

      先从我最熟悉的java开始,先上代码

     1 /**
     2  * Created by tangrubei on 2018/1/4.
     3  */
     4 public class VariableTest {
     5     //定义变量name
     6     private String name = "instance_name";
     7     //定义静态变量staticName
     8     private static String staticName = "static_name";
     9 
    10 
    11     public static void main(String[] args) {
    12         VariableTest variableTest = new VariableTest();
    13         VariableTest variableTest2 = new VariableTest();
    14 
    15         //实例variableTest访问变量和静态变量
    16         System.out.println(variableTest.name);
    17         System.out.println(variableTest.staticName);
    18 //        输出:instance_name
    19 //        输出:static_name
    20 
    21 
    22         //类访问变量和静态变量
    23 //        System.out.println(VariableTest.name);//类无法访问name变量
    24 //        System.out.println(VariableTest.staticName);
    25 
    26         //实例variableTest2访问变量和静态变量
    27         System.out.println(variableTest2.name);
    28         System.out.println(variableTest2.staticName);
    29 //        输出:instance_name
    30 //        输出:static_name
    31 
    32 //        实例variableTest修改变量和静态变量
    33         variableTest.name = "instance_name1";
    34         variableTest.staticName = "intance_name1";
    35 
    36 
    37         //实例variableTest访问变量和静态变量
    38         System.out.println(variableTest.name);
    39         System.out.println(variableTest.staticName);
    40 //        输出:instance_name1
    41 //        输出:intance_name1
    42 
    43         System.out.println(variableTest2.name);
    44         System.out.println(variableTest2.staticName);
    45 //        输出:instance_name1
    46 //        输出:intance_name1
    47 
    48 
    49     }
    50 }

     上面的代码很简单,java类Variable有两个变量,只是一个是静态的,根据这两个类实例化两个对象,其中一个对象修改了静态变量和变量,另一个对象的静态变量也会修改。这些都是在java中最基本的东西,应为类定义和静态变量都在方法区中,多个实例指向同一个方法区中的类和静态变量,引用都存在占内存中。而每个对象都在堆内存中有自己的空间,虽然对于线程来讲对象是共享的,但是类和类之前数据保持着独立性。所以就会上面的现象。

      而在python中就是另外一种情况了,还是先上代码

    class VariableTest(object):
        name = "name"
    
    # 创建实例variableTest 和 variableTest2
    variableTest = VariableTest()
    variableTest2 = VariableTest()
    
    print(variableTest.name)
    print(variableTest2.name)
    print(VariableTest.name)
    # 输出
    # name
    # name
    # name
    
    # variableTest修改name为name1
    variableTest.name = "name1"
    print(variableTest.name)
    print(variableTest2.name)
    print(VariableTest.name)
    # 输出
    # name1
    # name
    # name

      因为python没有静态变量的概念,所以就定义了一个name属性。与java不同的是,类本身也可以访问这边变量。每个实例与类本身似乎都有自己独立空间来保存这边变量,不过在看到下面这段代码的时候,又有些迷:

    class VariableTest(object):
        name = "name"
    
    # 创建实例variableTest 和 variableTest2
    variableTest = VariableTest()
    variableTest2 = VariableTest()
    
    print(id(variableTest.name))
    print(id(variableTest2.name))
    print(id(VariableTest.name))
    # 输出
    # 4375468944
    # 4375468944
    # 4375468944

      可以看出两个实例和类定义的name的内存地址都是同一个,其中一个修改了,另外两个都没有变化。找了一些资料得知python的变量定义是类似于标签的意思,也就是说两个实例和类定义的name以标签的形式贴在“name”上,当我改变其中一个变量的值之后,这个变量从“name”上撕下来,贴在了“name1”上面。

      是不是实例创建的时候,都会创建自己的标签呢

    class VariableTest(object):
        name = "name"
    
    
    
    # 创建实例variableTest
    variableTest = VariableTest()
    
    print(variableTest.__dict__)
    print(VariableTest.__dict__)
    # 输出
    #{}
    #{'__module__': '__main__', 'name': 'name', '__dict__': ......}

      上面的代码中可以看出,实例创建的时候并没有自己的name属性。可以理解python的变量会先在自己的块中寻找,如果找不到回到上一级块中寻找。

      说到这里会发现python对象的概念和js很像。在python中一切皆为对象,包括类定义,当我们实例化里一个对象的时候,可以理解为依据类为原子模型创建了一个对象,同时将实例与类对象简历引用关系,js是通过prototype的属性来制定,python应该是通过tpye的属性来制定。

      综上,在python中一切皆为对象,变量是以标签的形式来分配值的,实例中如果没有对应属性,会直接引用类对象的数据。

  • 相关阅读:
    读取.properties配置文件的方式
    使用二维数组打印10行的杨辉三角
    【三】Django模版的使用
    【二】Django 视图和url配置
    初学Django
    Java ------ 工厂模式、单例模式
    总结各种排序算法【Java实现】
    MyBatis --- 动态SQL、缓存机制
    MyBatis --- 映射关系【一对一、一对多、多对多】,懒加载机制
    SSM框架搭建
  • 原文地址:https://www.cnblogs.com/rubeitang/p/8192979.html
Copyright © 2020-2023  润新知