理解Python中的语法

时间:2015-07-30 10:54:42

标签: python

我正在尝试使用Python中的PodSixNet库来实现多人游戏。正如我在网上看到的一些教程,服务器文件如下:

import PodSixNet.Channel
import PodSixNet.Server
from time import sleep

class ClientChannel(PodSixNet.Channel.Channel):
    def Network(self, data):
        print data

class BoxesServer(PodSixNet.Server.Server):
    channelClass = ClientChannel

    def __init__(self, *args, **kwargs):
         PodSixNet.Server.Server.__init__(self, *args, **kwargs)

channelClass = ClientChannel行是什么意思?

channelClass绝对不是ClientChannel类的实例,因为实例声明不正确。那么它是什么呢?

3 个答案:

答案 0 :(得分:4)

所有这一切都是创建BoxesServer.channelClass类属性。它只是对另一个类的引用。

你为什么这样做?好吧,PodSixNet.Server.Server很灵活,它不会硬编码它将用于为新连接创建通道的类。相反,它会查找self.channelClass属性,并使用它来创建新的通道实例。请参阅Server.handle_accept() method source

self.channels.append(self.channelClass(conn, addr, self, self._map))

调用self.channelClass()然后创建分配给该属性的任何类的实例。这使您可以在定义新子类时轻松换出通道类。

请注意,PodSixNet.Server.Server()类在创建实例时也可以将通道类作为参数。然后,它将覆盖您设置的类属性。

答案 1 :(得分:1)

这是为了延期使用。

稍后,channelClass的任何实例化都会导致ClientChannel个实例。

将此视为一种允许开发人员使用他想要的任何类的方法,但PodSixNet.Server.Server子类将始终将channelClass实例化为他们无法知道将由哪个实际类提供显影剂

答案 2 :(得分:0)

在python类中是第一类对象。您可以像任何其他对象一样将它们分配给变量。 channelClass = ClientChannel表示分配给BoxesServer.channelClass班级ClientChannel(作为班级变量),稍后BoxesServer.channelClass可以像ClientChannel一样使用。

如果您从BoxesServer派生,然后在派生类中为channelClass分配另一个类,这可能很有用,这意味着您可以自定义要使用的类来代替ClientChannel }。例如,您可以在方法中写:

def getChannelInstance(self, *args, **kwds):
     return self.channelClass(*args, **kwds)

...它将根据类别返回一个实例。