首页 / 知识
python:类方法的目的是什么?
2023-04-13 20:30:00

我正在自学Python,而我最近的经验是Python不是Java,所以我花了一些时间将所有的类方法转换成函数。 我现在意识到,我不需要使用类方法来完成我在Java中使用 有没有人有在Python中使用类方法的好例子,或者至少有人能告诉我什么时候可以合理地使用类方法? 类方法用于当您需要不特定于任何特定实例,但仍然以某种方式涉及类的方法时。它们最有趣的地方是可以被子类覆盖,这在Java的静态方法或Python的模块级函数中是不可能的。 如果您有一个类 工厂方法(可选构造函数)确实是类方法的一个经典例子。 基本上,只要您希望有一个方法自然地适合于类的名称空间,但又不与类的特定实例关联,那么类方法就非常适合。 例如,在优秀的unipath模块中: 当前目录由于当前目录是进程范围的, 嗯…由于 这样考虑:普通方法对于隐藏分派的细节很有用:您可以输入 在创建实际实例之前进行设置或计算时,类方法是必不可少的,因为在实例存在之前,显然不能将实例用作方法调用的分派点。一个很好的例子可以在SQLAlchemy源代码中查看;请看下面链接中的 https://github.com/zzzeek/sqlalchemy/blob/ab6946769742602e40fb9ed9dde5f642885d1906/lib/sqlalchemy/dialects/mssql/pymssql.py#L47 我最近想要一个非常轻量级的日志类,它可以根据可编程设置的日志级别输出不同数量的输出。但我还想封装这个日志工具的功能,使其无需声明任何全局变量即可重用。 因此,我使用类变量和 使用我的简单日志类,我可以做以下事情:
然后,在我的代码中,如果我想输出一堆调试信息,我只需编写代码
错误可以被排除
在"生产"环境中,我可以指定
现在,只输出错误消息。调试消息将不会打印。 这是我的类:
还有一些测试它的代码:
替代构造函数就是一个经典的例子。 我认为最明确的答案是AmanKow的一个。归结起来就是你想要如何组织你的代码。你可以把所有的东西都写成模块级的函数,这些函数被封装在模块的命名空间中
上面的过程代码没有很好地组织,你可以看到,在只有3个模块之后,它变得混乱,每个方法做什么?您可以为函数使用长描述性的名称(如在java中),但是您的代码很快就会变得不可管理。 面向对象的方法是将代码分解为可管理的块i。e类,对象和函数可以与对象实例或类关联。 与模块级函数相比,使用类函数可以在代码中获得另一个级别的除法。因此,可以在类中对相关函数进行分组,使它们更特定于分配给该类的任务。例如,你可以创建一个文件工具类:
这种方法更灵活,更易于维护,您可以将函数分组在一起,而且每个函数的功能也更明显。此外,还可以防止名称冲突,例如,函数复制可能存在于代码中使用的另一个导入模块中(例如网络复制),因此,当使用全名FileUtil.copy()时,可以删除问题,并且可以同时使用这两个复制函数。 当用户登录到我的网站时,user()对象由用户名和密码实例化。 如果我需要一个没有用户登录的用户对象(例如,管理员用户可能想删除另一个用户帐户,所以我需要实例化该用户并调用其删除方法): 我有获取user对象的类方法。
它允许您编写可以与任何兼容类一起使用的泛型类方法。 例如:
如果你不使用
诚实?我从来没有发现静态方法或类方法的用法。我还没有见过不能使用全局函数或实例方法来完成的操作。 如果python像Java那样使用私有和受保护的成员,情况就会有所不同。在Java中,我需要一个静态方法来访问实例的私有成员。在Python中,这几乎没有必要。 通常,当人们真正需要做的只是更好地使用python的模块级名称空间时,我看到他们使用静态方法和类方法。 我以前使用PHP,最近我问自己,这个类方法是怎么回事?Python手册是非常技术性的,而且非常简短,所以它对理解该特性没有帮助。我在google上搜索了很久,终于找到了答案——> http://code.anjanesh.net/2007/12/pythonclassmethods.html。 如果你懒得点击它。我的解释更简短。:) 在PHP中(也许不是所有人都知道PHP,但是这种语言非常直接,每个人都应该理解我在说什么),我们有这样的静态变量:
两种情况下的输出都是20。 但是在python中,我们可以添加@classmethod装饰器,因此可以分别输出10和20。例子:
聪明,不是吗? 类方法提供了一个"语义糖"(不知道这个术语是否被广泛使用)——或者"语义便利性"。 示例:您得到了一组表示对象的类。您可能希望使用类方法 让我印象深刻的是,来自Ruby的一个所谓的类方法和一个所谓的实例方法只是一个将语义应用于其第一个参数的函数,当函数作为一个对象的方法(即 通常该对象必须是一个实例,但是 因为它只是一个函数,它只能在任何给定的范围内声明一次(例如 考虑一下:
您可以对一个实例调用
但不是在课堂上:
现在添加
调用一个实例现在传递它的类:
就像调用一个类一样:
只有惯例规定我们对实例方法的第一个参数使用 与Ruby:
Python类方法只是一个修饰函数,您可以使用相同的技术来创建自己的修饰器。修饰后的方法包装真实的方法(对于 脚注:在类和实例方法之间的名称冲突激起我的好奇心之后,我写了这篇文章。我不是一个Python专家,如果这些都是错误的,我希望得到您的评论。 我好几次问自己同样的问题。尽管这里的人努力地解释它,我发现最好的答案(和最简单的)是Python文档中类方法的描述。 还引用了静态方法。如果有人已经知道实例方法(我假设是这样),那么这个答案可能是将它们组合在一起的最后一部分…… 关于这个主题的进一步和深入的阐述也可在文件中找到:标准类型层次结构(向下滚动到实例方法部分) 这是一个有趣的话题。我的观点是,python classmethod的操作方式类似于单例,而不是工厂(工厂返回生成的类实例)。它是单例的原因是有一个公共对象,它只为类生成一次,但由所有实例共享。 这里有一个例子来说明这一点。注意,所有实例都有对单个字典的引用。这不是我所理解的工厂模式。这可能是python所特有的。
当然,类定义了一组实例。类的方法处理单个实例。类方法(和变量)是挂起与所有实例集相关的其他信息的位置。 例如,如果您的类定义了一组学生,您可能想要类变量或方法来定义学生可以属于的年级集之类的东西。 您还可以使用类方法来定义处理整个集合的工具。例如Student.all_of_em()可能返回所有已知的学生。显然,如果实例集的结构不止一组,则可以提供类方法来了解该结构。Students.all_of_em(等级="下属") 这样的技术倾向于将实例集的成员存储到植根于类变量的数据结构中。您需要小心避免破坏垃圾收集。 |
最新内容
相关内容
python的调用绑定方法和非绑定方法
python的调用绑定方法和非绑定方法,代码,方法,实例,第一,培训,时计,奇数,偶数,参数,定义,在Python中,如果用实例去调用方法,这种限制就被称为PyPython网络编程调用接收数据的三种
Python网络编程调用接收数据的三种方法,数据,代码,基础,通用,通讯,服务,网络,培训,方法,报文,最近在使用python进行网络编程开发一个通用的tcPython 3.6 中针对文件系统的神奇
Python 3.6 中针对文件系统的神奇方法,数字,代码,数据,标准,信息,培训,首次,工作,文件名,常数,Python3.6首次发布于2016年,尽管它已经发布了很Python 之模块重载的五种方法
Python 之模块重载的五种方法,环境,培训,方法,模块,文件夹,例子,下面,内容,语句,请看,python环境准备新建一个foo文件夹,其下包含一个bar.py文使用Python的toolz库开始函数式编
使用Python的toolz库开始函数式编程,代码,函数,培训,位置,参数,字典,顺序,操作,结果,测试,toolz库允许你操作函数,使其更容易理解,更容易测试代为什么Python没有main函数?
为什么Python没有main函数?,入口,代码,灵活,函数,培训,状态,统一,项目,网上,名称,毫无疑问,Python中没有所谓的主入口函数,但是互联网上经常有文提升Python数据分析能力的方法
提升Python数据分析能力的方法,分析,数据,工具,代码,时间,环境,报告,信息,培训,标准,1.Pandas分析包这个工具的好处是显而易见的。下面的动画Python内置函数
Python内置函数,数字,函数,培训,位置,第一,代码,异常,数据,公式,序列,python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好python之什么是函数式编程?
python之什么是函数式编程?,系统,概念,项目,大规模,状态,数据,培训,函数,语言,副作用,函数式编程(简称FP)是一种编程范式,其中最基本的元素是Python的函数式
Python的函数式,名称,术语,概念,培训,函数,变量,对象,参数,希腊字母,赋值,尽管Python并不是以函数式为主的语言,但对它来说支持函数式编程也相Python中字典合并的实现方法
Python中字典合并的实现方法,培训,结果,以上,版本,字典,方法,函数,下面,背景,发现,TableofContents背景Methon1:适用于Python3.5及以上版本呢M学习python的三种方法
学习python的三种方法,项目,代码,公司,时间,工程,培训,中级,初级,资料,第一,Python的用途十分广泛,不同的程序员将其用于不用的领域,不同的程序