Python - 使用'self' - noob在疯狂尝试理解它

时间:2010-07-07 09:18:20

标签: python class

我有一个简单的套接字类: 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并在首选项中设置了“编辑器”首选项以在标签时使用空格。

3 个答案:

答案 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的两个实例分配内存,它将分别分配给ab。如果没有像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 ...