Python-为什么在方法中未定义此类变量?

Python-为什么在方法中未定义此类变量?,第1张

Python-为什么在方法中未定义此类变量?

在Python中,您没有隐式访问方法内部的属性的权限。

像这样的裸名

currentid

del connections[currentid]

在尝试全局模块作用域之前,总是先在本地函数作用域中查找名称,然后在每个封闭的函数作用域中查找名称(然后将内置方法作为最后的选择)。

currentid
是一个类属性,在任何这些范围中都找不到。

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

所以这将工作:

del connections[self.currentid]

但是,我认为您的其余代码也没有按照您认为的那样做。该行中的

open
方法:

currentid = global_counter

没有设置对象

currentid
属性
SocketHandler
。除非您明确声明,否则为裸名分配 总是
分配给局部变量
global
(由于使用了
global
关键字,因此您似乎已经意识到这一点)。因此在
open
方法中,
currentid
是一个局部函数变量;
open
方法结束时,其值会丢失。

实际上,您的

SocketHandler
对象根本没有
currentid
属性(除非您没有向我们展示更多代码)。把
currentid =0
班上块不把所有的
SocketHandler
情况下一个
currentid
属性。它给
SocketHandler
本身
一个属性
currentid
; 就像该
def open(self):
open
在类对象上(而不是在每个单独的实例上)创建属性(存储函数)一样。

self.currentid
on_close
方法将无法
currentid
在对象中找到属性
self
,因此Python将查看类
self
SocketHandler
。这个对象
确实
有一个
currentid
值,所以阅读的结果
self.currentid
将是
0
,不管是不是你以前运行
open
SocketHandler

如果要

currentid
在每个实例中将as作为实例变量存储
SocketHandler
,则其中的行
open
必须为:

self.currentid = global_counter

这将分配给所

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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存