在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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)