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()方法是一种类方法,因为它需要在特定数据库连接的实例开始创建之前运行 - 但它不能是一个简单的函数或静态函数,因为他们希望它能够调用其他支持方法,这些方法可能类似地需要在子类中比在父类中更具体地写入。 如果你派遣到一个函数或静态类,那么你“忘记”,并失去了关于哪个类正在进行初始化的知识。

    链接地址: http://www.djcxy.com/p/9203.html

    上一篇: What are Class methods in Python for?

    下一篇: Best ways to teach a beginner to program?