Python中的类方法是什么?
我自学Python,最近的一次教训是Python不是Java,所以我花了一段时间才把所有的Class方法变成函数。
我现在意识到,我不需要使用Class方法来处理我在Java中使用static
方法所做的工作,但现在我不确定何时会使用它们。 我可以找到有关Python类方法的所有建议都是像我这样的新手应该避开的,标准文档在讨论它们时最为不透明。
有没有人有一个在Python中使用Class方法的好例子,或者至少有人能告诉我何时可以合理使用Class方法?
类方法适用于需要具有不特定于任何特定实例的方法,但仍以某种方式涉及该类的方法。 关于它们最有趣的是它们可以被子类覆盖,这在Java的静态方法或Python的模块级函数中根本无法实现。
如果你有一个MyClass
类和一个在MyClass(工厂,依赖注入桩等)上运行的模块级函数,则将它作为一个classmethod
。 然后它将可用于子类。
工厂方法(替代构造函数)确实是类方法的经典示例。
基本上,只要你希望有一种方法自然地适合类的名字空间,但不与类的特定实例相关联,那么类方法就是合适的。
举个例子,在优秀的unipath模块中:
当前目录
Path.cwd()
Path("/tmp/my_temp_dir")
。 这是一种类方法。 .chdir()
由于当前目录是过程范围广的,因此cwd
方法没有与其关联的特定实例。 但是,将cwd
更改为给定Path
实例的目录应该确实是一个实例方法。
嗯...因为Path.cwd()
确实返回一个Path
实例,我猜它可以被认为是一个工厂方法...
这样想一想:普通方法对隐藏调度细节很有用:你可以输入myobj.foo()
而不用担心foo()
方法是由myobj
对象的类还是其父类之一实现的。 类方法与此类似,但用类对象代替:它们让你调用MyClass.foo()
而不必担心foo()
是否由MyClass
特别实现,因为它需要它自己的专用版本,或者它是否让其父类处理该呼叫。
当您在创建实际实例之前进行设置或计算时,类方法非常重要,因为在实例存在之前,您显然无法将该实例用作方法调用的调度点。 一个很好的例子可以在SQLAlchemy源代码中查看; 请查看以下链接中的dbapi()
类方法:
https://github.com/zzzeek/sqlalchemy/blob/ab6946769742602e40fb9ed9dde5f642885d1906/lib/sqlalchemy/dialects/mssql/pymssql.py#L47
您可以看到,数据库后端用于按需导入其特定于供应商的数据库库的dbapi()
方法是一种类方法,因为它需要在特定数据库连接的实例开始创建之前运行 - 但它不能是一个简单的函数或静态函数,因为他们希望它能够调用其他支持方法,这些方法可能类似地需要在子类中比在父类中更具体地写入。 如果你派遣到一个函数或静态类,那么你“忘记”,并失去了关于哪个类正在进行初始化的知识。