我有一个简单的套接字类: MySocketLib.py ..
import socket
class socklib():
def create_tcp_serversocket(self,port):
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((socket.gethostname(), port))
serversocket.listen(5)
return serversocket
def send_msg(self, sock, msg, msglen):
... blah blah ...
def recv_msg(self, sock, msglen):
... blah blah ....
我的主文件是 Server.py ,如下所示:
import MySocketLib
class serverclass():
def __init__(self,port):
self.servsock = 0
self.port = port
def run(self):
self.servsock = self.create_tcp_serversocket(self.port)
(clientsock, address) = self.servsock.accept() # ERROR: 'SELF' not defined
... blah blah ...
#############################
### Main startup code
if __name__ == '__main__':
server = serverclass(2000) # server is on port 2000
server.run()
我一直收到以下错误:
File "D:\CodeLearn\Server.py", line 14, in serverclass
(clientsock, address) = self.servsock.accept()
NameError: name 'self' is not defined
我似乎无法理解“自我”的概念。有时,似乎需要,有时不需要。当它是python关键字时,为什么我需要在这里定义'self'?
谢谢大家......确实是标签和间距问题。我使用eclipse并在首选项中设置了“编辑器”首选项以在标签时使用空格。
答案 0 :(得分:4)
不要在Python源代码中使用制表符。将编辑器配置为始终使用空格。
self
不是Python关键字,它是一种约定。它是您正在使用的类的“实例”的通常名称。例如:
class X:
def __init__(self, v): self.v = v
a = X(1)
b = X(2)
print a.v, b.v
当此代码运行时,Python运行时最终将为X
的两个实例分配内存,它将分别分配给a
和b
。如果没有像self
那样的东西,你就得写:
a = X()
a.v = 1
b = X()
b.b = 2
print a.v, b.v
你会因为写b.b
而不是b.v
而收到错误。而且,调用方法将是彻头彻尾的丑陋:
class X:
def set(v): ???.v = v
您如何说“访问v
__init__
中分配的参考X
?
一种解决方案是将实例引用(指向为X
分配的内存的指针)作为参数传递:
class X:
def set(a, v): a.v = v
a.set(a, 1) # Holy ugly!
每个人都会使用不同的名字,我们都会违反DRY,这将是一团糟。所以Python做的是:
class X:
def set(self, v): self.v = v
a.set(1) # while "set" runs, "self" == "a"
b.set(2) # while "set" runs, "self" == "b"
那就是说,我不知道为什么上面的代码失败了。显然已定义self
,或者run()
方法的第一行已经发生错误。所以我的猜测是你混合使用空格和制表符进行缩进,这会让Python感到困惑,它会看到:
def run(self):
self.servsock = self.create_tcp_serversocket(self.port)
(clientsock, address) = self.servsock.accept() # ERROR: 'SELF' not defined
然后它会在解析类定义时尝试评估self.servsock.accept()
。那时候还没有实例(该类不存在!)所以self
也不可用。
结论:切勿混合标签和空格。
答案 1 :(得分:2)
可能是缩进错误。 文件
"D:\CodeLearn\Server.py", line 14, in serverclass这样
(clientsock, address) = self.servsock.accept()
不在运行函数中,但在 serverclass 本身
答案 2 :(得分:0)
您的缩进是错误的,因此__init__()
和run()
被解释为顶级函数 - 没有自动self
参数。你需要的是:
class serverclass:
def __init__(self,port):
self.servsock = 0
self.port = port
def run(self):
self.servsock = self.create_tcp_serversocket(self.port)
(clientsock, address) = self.servsock.accept() # ERROR: 'SELF' not defined
... blah blah ...