由于类是 Python 中的一等对象,我们可以将它们传递给函数。例如,这是我遇到的一些代码:
ChatRouter = sockjs.tornado.SockJSRouter(ChatConnection, '/chat')
其中ChatConnection
是在同一模块中定义的类。我想知道这种做法的常见用户案例是什么?
另外,在上面的代码示例中,为什么变量“ChatRouter”是大写的?
传递类可能对定制和灵活的代码很有用。该函数可能想要创建给定类的多个对象,因此将一个类传递给它是实现它的一种方法(另一种方法是传递某种工厂函数)。例如,在您给出的示例中,SockJSRouter
最终将连接类传递给Session
,然后使用它来构造一个新的连接对象。
至于ChatRouter
,我想这只是一个命名约定。虽然建议 Python 程序员遵循 PEP 8,而且很多人都这样做,但这并不是严格要求,并且一些项目采用不同的命名约定。
在不知道有关该代码的任何其他信息的情况下,我猜想:
好的,我看了一下源码。这条线以下是不正确的,尽管是合理的。基本上,代码所做的是ChatConnection
用来创建一个Session
做其他事情的对象。ChatRouter
只是一个命名错误的常规变量,而不是类名。
SockJSRouter
是一个接受另一个类(调用它connection
)和一个字符串作为参数的类。它用于__new__
创建的不是 的实例SockJSRouter
,而是使用(可能是子类)的特殊类的实例connection
。这可以解释为什么ChatRouter
要大写,因为它是一个类名。返回的类将用于connection
概括很多事情,例如connection
负责处理通过网络或其他方式进行的通信。因此,通过使用不同connection
的 s,可以处理不同的协议。ChatConnection
可能是 IRC 上的一些层。
所以基本上,常见的用例(也可能在这里使用)是泛化,而 BactrianCase 名称的原因是因为它是一个类(只是在运行时生成的一个)。