您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python – 为什么这个类变量没有在方法中定义?

5b51 2022/1/14 8:22:33 python 字数 5099 阅读 550 来源 www.jb51.cc/python

我有一个 python应用程序,如下所示: global_counter = 0 connections = {} class SocketHandler(): currentid = 0 def open(self): global global_counter global connections currentid = glo

概述

global_counter = 0
connections = {}

class SocketHandler():
    currentid = 0
    def open(self):
        global global_counter
        global connections
        currentid = global_counter
        global_counter += 1
        connections[currentid] = self
        print "WebSocket " + str(currentid) + " opened"

    def on_close(self):
        global connections
        print "WebSocket " + str(currentid) + " closed"
        del connections[currentid]

我收到错误

NameError: global name 'currentid' is not defined

在“打开”和“on_close”的行上,我打印我打开/关闭连接.我在课堂上定义了它,为什么不在范围内.另外,我已经读过使用全局变量很糟糕,但我没有看到解决方法.有人可以指出我应该做什么吗?谢谢.

像行中的当前名称一样简单:

del connections[currentid]

在尝试全局模块范围之前,总是在本地函数范围中查找名称,然后在每个封闭的函数范围中查找(然后将内置函数视为最后的手段). currentid是一个属性,在任何这些范围中都找不到.

要在Python中查找属性,您始终需要指定要查看的对象.虽然查找协议意味着对象不一定必须具有属性本身;属性查找将回退到您指定的对象的类(以及基类,如果涉及继承).

这样可行:

del connections[self.currentid]

但是,我不认为你的代码的其余部分正在做你认为的那样.这行在open方法中:

currentid = global_counter

不设置SocketHandler对象的currentid属性.分配给一个名称总是分配给一个局部变量,除非你明确地将它声明为全局(你似乎已经意识到这一点,因为你已经使用了global关键字).所以在open方法中,currentid是一个局部函数变量;它的值在open方法结束时丢失.

实际上,您的SocketHandler对象根本没有currentid属性(除非您没有向我们展示更多代码).将currentid = 0放在类块中并不会为所有SocketHandler实例提供currentid属性.它为SocketHandler类本身提供了一个属性currentntid;这就像def open(self):block在类对象上创建一个open属性(存储一个函数),而不是在每个单独的实例上.

在on_close方法中读取self.currentid将无法在对象self中找到currentid属性,因此Python将查看self类,即SocketHandler.该对象确实具有currentntid值,因此读取self.currentid的结果将为0,无论您以前是否在该SocketHandler上运行open.

如果您打算将currentid存储为每个SocketHandler中的实例变量,那么open中的行必须是:

self.currentid = global_counter

这将指定self引用的对象的currentid属性.然后,您还需要将方法中对currentid的所有其他引用更改为self.currentid.

总结

以上是编程之家为你收集整理的Python – 为什么这个类变量没有在方法中定义?全部内容,希望文章能够帮你解决Python – 为什么这个类变量没有在方法中定义?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶