我正在尝试使用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
类的实例,因为实例声明不正确。那是什么呢?你知道吗
在python中,类是第一类对象。您可以像其他任何对象一样将它们指定给变量。
channelClass = ClientChannel
意味着给BoxesServer.channelClass
分配类ClientChannel
(作为一个类变量),后面的BoxesServer.channelClass
可以像ClientChannel
一样使用。你知道吗如果您从
BoxesServer
派生,然后在派生类中为channelClass
分配另一个类,这可能很有用,这意味着您可以自定义要用来代替ClientChannel
的类。例如,您可以在方法中写入:…它将根据类返回一个适当的实例。你知道吗
所有这些只需要创建
BoxesServer.channelClass
类属性。它只是对另一个类的引用。你知道吗你为什么要这么做?嗯,} method source :
PodSixNet.Server.Server
是灵活的,它不硬编码它将用来为新连接创建通道的类。相反,它将查找self.channelClass
属性,并使用该属性创建新的通道实例。参见^{调用
self.channelClass()
然后创建分配给该属性的任何类的实例。这使您可以在定义新的子类时轻松地交换channel类。你知道吗注意,
PodSixNet.Server.Server()
类在创建实例时也可以将channel类作为参数。然后将覆盖您设置的类属性。你知道吗这是为了延期使用。你知道吗
稍后,
channelClass
的任何实例化都将导致ClientChannel
实例。你知道吗将此视为允许开发人员使用他想要的任何类的一种方式,但是
PodSixNet.Server.Server
子类总是将channelClass
实例化为它们不知道开发人员将给出什么真正的类。你知道吗相关问题 更多 >
编程相关推荐