2024-05-17 04:34:26 发布
网友
我在自学Python,最近的一节课是Python is not Java,所以我花了一段时间把所有的类方法都转换成函数。
我现在意识到,我不需要使用类方法来处理Java中的static方法,但现在我不确定何时使用它们。我能找到的关于Python类方法的所有建议都是像我这样的新手应该避开它们,而标准文档在讨论它们时最不透明。
static
有没有人有在Python中使用类方法的好例子,或者至少有人能告诉我什么时候可以明智地使用类方法?
类方法适用于需要具有不特定于任何特定实例但仍以某种方式涉及类的方法的情况。最有趣的是它们可以被子类重写,这在Java的静态方法或Python的模块级函数中是不可能的。
如果您有一个类MyClass,并且有一个在MyClass(工厂、依赖注入存根等)上操作的模块级函数,那么将其设为classmethod。然后它将可用于子类。
MyClass
classmethod
这样想:普通方法有助于隐藏分派的细节:您可以键入myobj.foo(),而不必担心foo()方法是由myobj对象的类还是其父类之一实现的。类方法与此完全类似,但与类对象相反:它们允许您调用MyClass.foo(),而不必担心foo()是否由MyClass特别实现,因为它需要自己的专用版本,或者它是否允许其父类处理调用。
myobj.foo()
foo()
myobj
MyClass.foo()
当您在创建实际实例之前进行设置或计算时,类方法是必不可少的,因为在实例存在之前,您显然不能将实例用作方法调用的分派点。在SQLAlchemy源代码中可以看到一个很好的示例;请在以下链接中查看dbapi()类方法:
dbapi()
https://github.com/zzzeek/sqlalchemy/blob/ab6946769742602e40fb9ed9dde5f642885d1906/lib/sqlalchemy/dialects/mssql/pymssql.py#L47
您可以看到,数据库后端使用dbapi()方法根据需要导入特定于供应商的数据库库,它是一个类方法,因为它需要在开始创建特定数据库连接的实例之前运行,但它不能是一个简单的函数或静态函数,因为他们希望它能够调用其他支持方法,这些方法可能同样需要在子类中比在父类中写得更具体。如果您分派到一个函数或静态类,那么您将“忘记”并失去关于哪个类正在进行初始化的知识。
工厂方法(替代构造函数)确实是类方法的经典示例。
基本上,类方法在任何时候都是合适的,因为您希望有一个方法自然地适合于类的命名空间,但它不与类的特定实例相关联。
例如,在优秀的unipath模块中:
Path.cwd()
Path("/tmp/my_temp_dir")
.chdir()
由于当前目录是进程范围的,cwd方法没有应该与之关联的特定实例。但是,将cwd更改为给定Path实例的目录确实应该是实例方法。
cwd
Path
嗯。。。由于Path.cwd()确实返回了一个Path实例,我想它可以被认为是一个工厂方法。。。
类方法适用于需要具有不特定于任何特定实例但仍以某种方式涉及类的方法的情况。最有趣的是它们可以被子类重写,这在Java的静态方法或Python的模块级函数中是不可能的。
如果您有一个类
MyClass
,并且有一个在MyClass(工厂、依赖注入存根等)上操作的模块级函数,那么将其设为classmethod
。然后它将可用于子类。这样想:普通方法有助于隐藏分派的细节:您可以键入
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()
方法根据需要导入特定于供应商的数据库库,它是一个类方法,因为它需要在开始创建特定数据库连接的实例之前运行,但它不能是一个简单的函数或静态函数,因为他们希望它能够调用其他支持方法,这些方法可能同样需要在子类中比在父类中写得更具体。如果您分派到一个函数或静态类,那么您将“忘记”并失去关于哪个类正在进行初始化的知识。工厂方法(替代构造函数)确实是类方法的经典示例。
基本上,类方法在任何时候都是合适的,因为您希望有一个方法自然地适合于类的命名空间,但它不与类的特定实例相关联。
例如,在优秀的unipath模块中:
当前目录
Path.cwd()
Path("/tmp/my_temp_dir")
。这是一个类方法。.chdir()
由于当前目录是进程范围的,
cwd
方法没有应该与之关联的特定实例。但是,将cwd
更改为给定Path
实例的目录确实应该是实例方法。嗯。。。由于
Path.cwd()
确实返回了一个Path
实例,我想它可以被认为是一个工厂方法。。。相关问题 更多 >
编程相关推荐