python程序中用类变量代替global 定义全局变量(详细教程)

python程序中用类变量代替global 定义全局变量(详细教程)

Python编程,在类的def函数之间进行参数传递,可以采用队列、全局变量、类变量等方法

一般情况下,使用global 关键字来定义全局变量,但是发现 global 关键字在涉及多个文件时,好像存在问题。

比如,单个文件下用global定义使用全局变量的情况 ,看下面的代码

# -*-coding: utf-8 -*-
#from data_def import *
distance=34

class test(object):
    def __init__(self):
       pass
    #在类里面改变全局变量的值
    def change_1(self):
        global distance
        distance=90
        print("distance in class:", distance)

    #输出全局变量的值
    def print_value(self):
        global distance
        print("distance in class:", distance)

#在函数里面使用和打印全局变量的值
def function_test():
    global distance
    print("global value in function", distance)
    distance=234
    print("global value in function",distance)

function_test()  #在函数里面使用和改变全局变量的值 34->234
t=test()
t.print_value()  #在类里面打印全局变量的值 234
t.change_1()   #在类里面改变全局变量的值 234->90

程序运行结果如下:全局变量运行正确

global value in function 34
global value in function 234
distance in class: 234
distance in class: 90

下面把上述代码拆分成两个文件,data_def.pymain.pydata_def.py 定义全局变量distance 和类 ,main.py 导入data_def.py

data_def.py文件代码如下:

# -*-coding: utf-8 -*-
distance=34
class test(object):
    def __init__(self):
       pass
    #在类里面改变全局变量的值
    def change_1(self):
        global distance
        distance=90
        print("distance in class:", distance)

    #输出全局变量的值
    def print_value(self):
        global distance
        print("distance in class:", distance)

main.py文件代码如下:

# -*-coding: utf-8 -*-
from data_def import *
#在函数里面使用和打印全局变量的值
def function_test():
    global distance
    print("global value in function", distance)
    distance=234
    print("global value in function",distance)

print("gloabl value in main:",distance)  #主函数里面,全局变量为34
function_test()  #在函数里面使用和改变全局变量的值 34->234
t=test()
t.print_value()  #在类里面打印全局变量的值 输出为 34 并非是234,函数里面改变全局变量值不影响类里面全局变量的值???
t.change_1()   #在类里面改变全局变量的值 34->90

程序运行结果:

gloabl value in main: 34
global value in function 34
global value in function 234
distance in class: 34
distance in class: 90

两次运行的结果存在出入,可以发现,用global 在不同文件间操作全局变量时,生成的结果和我们想象的不太一样(也就说在main.py中变量distance已经发生改变,但是回到data_def.py中进行运行,显示distance仍然为原来的数值)。

为此,可以考虑用类变量来定义全局变量。实现方式看以下代码。

第一个文件(data_def.py)定义两个类,第一个类定义全局变量distance ,第二个类为普通操作类

# -*-coding: utf-8 -*-
#filename:data_def.py
#构造类变量作为全局变量,代替global
class global_value():
    distance=34

class test(object):
    def __init__(self):
       pass
    #在类里面改变全局变量的值
    def change_1(self):
        global_value.distance=40
        print("distance in class:", global_value.distance)

    def change_2(self):
        global_value.tail_dis=90
        print("distance in class:",global_value.distance)

    #输出全局变量的值
    def print_value(self):
        print("distance in class:", global_value.distance)

第二个文件(main.py) 导入第一个文件定义的类,并进行变量操作

# -*-coding: utf-8 -*-
from data_def import *

#在函数里面使用和打印全局变量的值
def function_test():
    print("global value in function", global_value.distance)
    global_value.distance=234
    print("global value in function",global_value.distance)

print("global value in main:",global_value.distance)   #打印出全局变量的初始值:34
t=test()
t.change_1()                                           #在类里面改变全局变量的值:34->40
print("global value in main:",global_value.distance)
t.change_2()                                           #在类里面改变全局变量的值:40->90
print("global value in main:",global_value.distance)
function_test()                                        #在自定义函数里面使用和改变全局变量的值 90->234
global_value.distance=11                               #在main主函数里面改变全局变量的值 234->11
t.print_value()                                        #在类里面查看已经改变的全局变量的值 11

程序输出结果如下:

global value in main: 34
distance in class: 40
global value in main: 40
distance in class: 40
global value in main: 40
global value in function 40
global value in function 234
distance in class: 11

从输出结果可以看出,利用类变量的方式也可以实现全局变量的定义,并且可以跨文件操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2130.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Vue进阶(四十七):面试必备:2022 Vue经典面试题总结(含答案)

    Vue进阶(四十七):面试必备:2022 Vue经典面试题总结(含答案)面试必备:2019Vue经典面试题总结(含答案)一、什么是MVVM?MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。Model层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View代表UI组件,它负责将数据模型转化成UI展现出来,ViewModel是一个同步View和Model的对象。在MVVM架构下,View和Mod…

  • js将json字符串转换成json对象_json对象转字符串

    js将json字符串转换成json对象_json对象转字符串json简介及json字符串转换成json对象JSON有两种表示结构:对象和数组对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码 { key1:value1, key2:value2, … } 其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组数组结构以”[”开始,以”]”结束。中间由0或多个以”,”分隔

  • shell if 小数 比较

    shell if 小数 比较shell的[]对于数值的判断都是基于整数的,如果碰到小数就无能为力了。google了一把发现用awk的牛人多,不过发现一个兄弟的更加好。if[`expr$a\>$b`-eq0];thenecho$bisbiggerelseecho$aisbiggerfi通过ex…

  • EJB学习日志

    EJB学习日志第一天:经典的:HelloWord 1. 编写helloword接口packagecom.ejb;publicinterfaceHelloWord{ publicStringsayHello(Stringname);}2.HelloWord的实现packagecom.ejb.impl;importjavax.ejb.Remote;impor

  • SQL中的聚合函数介绍

    SQL中的聚合函数介绍  什么是聚合函数(aggregatefunction)?聚合函数对一组值执行计算并返回单一的值。 聚合函数有什么特点?除了COUNT以外,聚合函数忽略空值。 聚合函数经常与SELECT语句的GROUPBY子句一同使用。 所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。 标量函数:只能对单个的数字或值进行计算。主…

  • javaweb分页显示_java分页查询原理思路

    javaweb分页显示_java分页查询原理思路效果图如下:实现步骤:1.创建实体User.class,参考代码如下:publicclassUser{ privateStringname; privateintage; privateStringgender; publicStringgetName(){ returnname; } publicvoidsetName(Stri…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号