2010-04-29 44 views
1

我有这样的代码约Python脚本

class HNCS (ThreadingTCPServer): 

    def verify_request(self, request, client_address): 

     for key in connections: 

      if connections[key].client_address[0] == client_address[0]: 

       if client_address[0] != '127.0.0.1': 

        return False 

     return True 

    def welcome(self): 

     return '''______________________________________________________ 
------------------------------------------------------ 
%s 
______________________________________________________ 
------------------------------------------------------ 
* Server started %s 
* Waiting for connections on port %i 
''' % (gpl, ctime(), PORT) 

我只是想不通的地方说 如果连接[关键] .client_address [0] == CLIENT_ADDRESS [0]

行我们如何将client_address用作字典后的属性?

回答

2

也许字典存储的值是碰巧具有client_address成员属性的对象?

换句话说,.client_address那里不是与作为参数传入的client_address相同的东西。相反,它是恰好存储在connections[key]中的类中的字段的名称。

+0

MMM不能弄清楚,可以用一个例子来解释它??? – 0xab3d 2010-04-29 23:45:49

+0

不要打扰乌尔自我,得到:d 日Thnx家伙 – 0xab3d 2010-04-29 23:54:01

+0

另一个问题, 当我一类 测试中说[self.name] =自 这是否意味着其属性的对象本身存储在发生什么名称给出的名单? – 0xab3d 2010-04-29 23:59:54

1

因为connections字典可能有一个带有client_address属性的对象?

喜欢:

class SomeClass(object): 
    def __init__(self, address) : 
      self.client_address = address 

connections = {"oscar":SomeClass(["127.0.0.1","192.60.0.1"])} 

for key in connections: 
    print connections[key].client_address[0] 

编辑

dict是其中值可以使用密钥被存储在字典中。当您再次请求该密钥时,您可以返回该值,这很简单。

在我前面的例子

因此,该行:

connections = {"oscar":SomeClass(["127.0.0.1","192.60.0.1"])} 

可以写为:

connection = [] 
connections["oscar"] = SomeClass(["1","2"]) 
s = connections["oscar"] 

在您的评论test[self.name] = self您的存储由self表示的对象为使用nametest词典作为关键。

+0

thnxxxxxxxx男人, – 0xab3d 2010-04-29 23:55:04

+0

另一个问题, 当我在一个类里面说什么时会发生什么 test [self.name] = self 这是否意味着对象本身及其属性存储在列表中,名称为??? – 0xab3d 2010-04-29 23:59:35

+0

准确。我已经更新了答案。 – OscarRyz 2010-04-30 00:17:11

1
for key in connections: 
     if connections[key].client_address[0] == client_address[0]: 

这简直是在看存储在connections字典中的所有值,看看是否有自己的属性命名client_address具有相同的第一个项目(IP地址)作为局部变量client_address。变量没有必要与字典中的值的属性具有相同的名称。

它的意思是:如果来自同一IP地址的另一个连接已经被服务,则中止连接。 (除本地主机,其被允许作为它喜欢有尽可能多的连接。)

它可以被重新拼写为:

def verify_request(self, request, new_client_addr): 
    ip= new_client_addr[0] 
    active_ips= [value.client_address[0] for value in connections.values()] 
    return ip not in active_ips or ip=='127.0.0.1' 
+0

是verify_request函数重载? – 0xab3d 2010-04-30 10:16:10

+0

@kmitnick:在Python中没有函数重载。 – bobince 2010-04-30 10:47:11