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