理解Python中的语法

2024-05-21 03:16:11 发布

您现在位置: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类的实例,因为实例声明不正确。那是什么呢?你知道吗


Tags: 实例importself游戏dataserverinitdef
3条回答

在python中,类是第一类对象。您可以像其他任何对象一样将它们指定给变量。channelClass = ClientChannel意味着给BoxesServer.channelClass分配类ClientChannel(作为一个类变量),后面的BoxesServer.channelClass可以像ClientChannel一样使用。你知道吗

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

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

…它将根据类返回一个适当的实例。你知道吗

所有这些只需要创建BoxesServer.channelClass类属性。它只是对另一个类的引用。你知道吗

你为什么要这么做?嗯,PodSixNet.Server.Server是灵活的,它不硬编码它将用来为新连接创建通道的类。相反,它将查找self.channelClass属性,并使用该属性创建新的通道实例。参见^{} method source

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

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

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

这是为了延期使用。你知道吗

稍后,channelClass的任何实例化都将导致ClientChannel实例。你知道吗

将此视为允许开发人员使用他想要的任何类的一种方式,但是PodSixNet.Server.Server子类总是将channelClass实例化为它们不知道开发人员将给出什么真正的类。你知道吗

相关问题 更多 >