![]() |
1
167
类方法是用于需要具有不特定于任何特定实例但仍以某种方式涉及类的方法的情况。最有趣的是,它们可以被子类重写,这在Java的静态方法或Python的模块级函数中是不可能的。
如果你有课
|
![]() |
2
62
工厂方法(可选构造函数)确实是类方法的经典示例。 基本上,类方法在任何时候都适用,因为您希望有一个方法自然地适合于类的名称空间,但不与类的特定实例相关联。 举个例子,在优秀的 unipath 模块: 当前目录
由于当前目录是进程范围的,因此
六羟甲基三聚氰胺六甲醚。。。作为
|
![]() |
3
46
这样想:普通方法对于隐藏分派的细节很有用:您可以键入
当您进行设置或计算时,类方法是必不可少的
先于
创建实际实例,因为在实例存在之前,显然不能将该实例用作方法调用的调度点。在sqlacalchemy源代码中可以看到一个很好的示例;请看
你可以看到
|
![]() |
4
27
我最近想要一个非常轻量的日志类,它将根据可以通过编程设置的日志级别输出不同数量的输出。但我不想每次输出调试消息、错误或警告时都实例化该类。但我还想封装这个日志记录工具的功能,使其在没有任何全局声明的情况下可重用。
所以我用类变量和
使用我的简单日志类,我可以执行以下操作:
然后,在我的代码中,如果我想吐出一堆调试信息,我只需要编写代码
错误可能会被排除
在“生产”环境中,我可以指定
现在,只输出错误消息。将不打印调试消息。 这是我的课:
还有一些测试它的代码:
|
![]() |
5
23
替代构造函数是典型的例子。 |
![]() |
6
10
我认为最清楚的答案是 AmanKow 一个。归根结底就是你想如何组织你的代码。您可以将所有内容编写为封装在模块名称空间中的模块级函数,即
上面的过程代码没有很好的组织,正如您在仅3个模块之后看到的那样,它会变得混乱,每个方法都是做什么的?您可以使用函数的长描述性名称(如Java),但代码仍然很难管理。 面向对象的方法是将代码分解为可管理的块,即类和对象以及函数可以与对象实例或类相关联。 与模块级函数相比,类函数在代码中获得了另一个级别的除法。 因此,您可以对类中的相关函数进行分组,以使它们更特定于您分配给该类的任务。例如,您可以创建一个文件实用程序类:
这种方式更加灵活和易于维护,您可以将函数分组在一起,并且对每个函数的作用更加明显。此外,还可以防止名称冲突,例如,函数复制可能存在于代码中使用的另一个导入模块(例如网络复制)中,因此当使用全名fileUtil.copy()时,可以消除此问题,并且两个复制函数都可以并排使用。 |
![]() |
7
9
当用户登录到我的网站时,会根据用户名和密码实例化一个user()对象。 如果我需要一个用户对象而用户不在那里登录(例如,管理员用户可能希望删除另一个用户帐户,因此我需要实例化该用户并调用其删除方法): 我有类方法来获取用户对象。
|
![]() |
8
6
说真的?我从来没有找到StaticMethod或ClassMethod的用法。我还没有看到使用全局函数或实例方法无法完成的操作。 如果Python使用的是私有的和受保护的成员,就更像Java了。在爪哇中,我需要一个静态方法来访问一个实例的私有成员来做事情。在Python中,这是很少必要的。 通常,我看到人们使用staticmethods和classmethods,而他们真正需要做的就是更好地使用Python的模块级名称空间。 |
![]() |
9
6
它允许您编写可用于任何兼容类的通用类方法。 例如:
如果你不使用
|
![]() |
10
5
我以前用过PHP,最近我问自己,这个类方法怎么样了?python手册是非常技术性的,而且非常简短,所以它不会帮助理解这个特性。我在google和google中找到了答案--gt; http://code.anjanesh.net/2007/12/python-classmethods.html . 如果你懒得点击它。我的解释是简短的。:) 在php中(也许不是所有人都知道php,但是这种语言非常直截了当,每个人都应该理解我所说的内容),我们有如下静态变量:
两种情况下的输出均为20。 但是在python中,我们可以添加@classmethod decorator,因此可以分别输出10和20。例子:
聪明,不是吗? |
![]() |
11
4
类方法提供“语义糖”(不知道这个术语是否被广泛使用)或“语义便利性”。
示例:您得到了一组表示对象的类。您可能需要类方法
|
![]() |
12
3
我刚从Ruby那里得到的消息是
班
方法和所谓的
实例
方法只是对其第一个参数应用语义意义的函数,当
功能
作为
对象
(即
通常情况下
对象
必须是实例,但
因为它只是一个
功能
,它只能在任何给定范围内声明一次(即
考虑一下:
你可以打电话
但不是在课堂上:
现在添加
对实例的调用现在传递其类:
就像调用类一样:
只有惯例规定我们使用
与红宝石形成对比:
python类方法只是
装饰功能
你也可以用同样的方法
create your own decorators
. 一个修饰的方法包装了真实的方法(在
脚注:在一个类和实例方法的名称冲突之后,我写了这篇文章,激起了我的好奇心。我远不是一个Python专家,如果有任何错误,我想发表评论。 |
![]() |
13
2
这是一个有趣的话题。我的看法是,python classmethod的操作类似于一个单独的实例,而不是一个工厂(它返回一个生成的类实例)。它是单例的原因是有一个公共对象被生成(字典),但是类只有一次,但是所有实例都共享。 为了说明这一点,这里有一个例子。请注意,所有实例都引用了单个字典。据我所知,这不是工厂模式。这可能是Python所独有的。
|
![]() |
14
2
我也问过自己同样的问题几次。尽管这里的人努力解释,但我发现最好(也是最简单)的答案是 description python文档中的类方法。 还有对静态方法的引用。如果有人已经知道实例方法(我假设),那么这个答案可能是最后一个将所有方法组合在一起的部分…… 关于这个主题的进一步深入的阐述也可以在文档中找到: The standard type hierarchy (向下滚动到 实例方法 部分) |
![]() |
15
0
当然,类定义了一组实例。类的方法在单个实例上工作。类方法(和变量)是挂起与实例集相关的其他信息的地方。 例如,如果您的班级定义了一组学生,您可能需要班级变量或方法,这些变量或方法定义了学生可以成为其成员的一组分数。 还可以使用类方法定义用于处理整个集合的工具。例如student.all_em()可能会返回所有已知的学生。显然,如果您的实例集的结构多于一个集,那么您可以提供类方法来了解该结构。学生们,所有的学生们 这样的技术往往会导致将实例集的成员存储到基于类变量的数据结构中。那么,您需要注意避免使垃圾收集受到阻碍。 |
|
Hash Doe · 为什么类变量可以通过类实例访问?[副本] 7 年前 |
![]() |
Phoenix · Python-类方法() 11 年前 |
![]() |
appleLover · Python-使用类方法 11 年前 |
![]() |
viral · 目标C中的静态方法(不是类方法) 11 年前 |
|
user2000809 · Objective-C:使用静态变量 11 年前 |
![]() |
Ishmael · 如何编写.add()方法?[已关闭] 12 年前 |
![]() |
Ethan Turkeltaub · 使用二级扩展类中的方法[closed] 12 年前 |