我正在尝试使用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
类的实例,因为实例声明不正确。那么它是什么呢?
答案 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)
...它将根据类别返回一个实例。