0

由于类是 Python 中的一等对象,我们可以将它们传递给函数。例如,这是我遇到的一些代码:

ChatRouter = sockjs.tornado.SockJSRouter(ChatConnection, '/chat')

其中ChatConnection是在同一模块中定义的类。我想知道这种做法的常见用户案例是什么?

另外,在上面的代码示例中,为什么变量“ChatRouter”是大写的?

4

2 回答 2

1

传递类可能对定制和灵活的代码很有用。该函数可能想要创建给定类的多个对象,因此将一个类传递给它是实现它的一种方法(另一种方法是传递某种工厂函数)。例如,在您给出的示例中,SockJSRouter最终将连接类传递给Session,然后使用它来构造一个新的连接对象。

至于ChatRouter,我想这只是一个命名约定。虽然建议 Python 程序员遵循 PEP 8,而且很多人都这样做,但这并不是严格要求,并且一些项目采用不同的命名约定。

于 2012-05-04T03:03:06.203 回答
1

在不知道有关该代码的任何其他信息的情况下,我猜想:

好的,我看了一下源码。这条线以下是不正确的,尽管是合理的。基本上,代码所做的是ChatConnection用来创建一个Session做其他事情的对象。ChatRouter只是一个命名错误的常规变量,而不是类名。


SockJSRouter是一个接受另一个类(调用它connection)和一个字符串作为参数的类。它用于__new__创建的不是 的实例SockJSRouter,而是使用(可能是子类)的特殊类的实例connection。这可以解释为什么ChatRouter要大写,因为它是一个类名。返回的类将用于connection概括很多事情,例如connection负责处理通过网络或其他方式进行的通信。因此,通过使用不同connection的 s,可以处理不同的协议。ChatConnection可能是 IRC 上的一些层。

所以基本上,常见的用例(也可能在这里使用)是泛化,而 BactrianCase 名称的原因是因为它是一个类(只是在运行时生成的一个)。

于 2012-05-04T03:08:30.190 回答