为啥我应该在 python 中使用类方法? [复制]

Posted

技术标签:

【中文标题】为啥我应该在 python 中使用类方法? [复制]【英文标题】:Why should I use a classmethod in python? [duplicate]为什么我应该在 python 中使用类方法? [复制] 【发布时间】:2017-09-12 05:21:45 【问题描述】:

我正在 python 的某个类中编写一个函数,人们建议我在这个函数中添加一个 @classmethod 装饰器。

我的代码:

import random


class Randomize:
    RANDOM_CHOICE = 'abcdefg'

    def __init__(self, chars_num):
        self.chars_num = chars_num

    def _randomize(self, random_chars=3):
        return ''.join(random.choice(self.RANDOM_CHOICE)
                       for _ in range(random_chars))

建议的更改:

    @classmethod
    def _randomize(cls, random_chars=3):
        return ''.join(random.choice(cls.RANDOM_CHOICE)
                       for _ in range(random_chars))

我几乎总是只使用_randomize 函数。

我的问题是:在函数中添加 classmethod 装饰器有什么好处?

【问题讨论】:

它更清楚地表明该方法不使用来自实例的任何状态,通常命名为self。这也意味着您可以在不创建实例的情况下在类上对其进行测试。 另外,如果这个类不包含太多其他内容,最好使用函数和functools.partial()。也许吧。 【参考方案1】:

如果您看到 _randomize 方法,则说明您没有在其中使用任何实例变量(在 init 中声明),而是使用了一个类 var,即 RANDOM_CHOICE = 'abcdefg'

import random

class Randomize:
    RANDOM_CHOICE = 'abcdefg'

    def __init__(self, chars_num):
        self.chars_num = chars_num

    def _randomize(self, random_chars=3):
        return ''.join(random.choice(self.RANDOM_CHOICE)
                       for _ in range(random_chars))

这意味着,您的方法可以存在而不是实例方法,您可以直接在类上调用它。

  Randomize._randomize()

现在问题来了,它有什么优势吗?

我想是的,您不必通过创建实例来使用此方法,这会产生开销。

ran = Randomize() // Extra steps
ran._randomize()   

您可以阅读更多关于类和实例变量here。

【讨论】:

我仍然不明白我猜的重点。如果您想调用该方法并且不需要该类的实例,那么为什么不将该方法放在该类之外呢? @ryanjdillon 为什么不在该类之外使用该方法? 好吧,因为该方法非常适合该类,但您也可以在其他东西中使用它.为什么在其他地方使用classmethod 而不是method?因为它需要来自类的参数,所以它不需要来自实例的参数。当您需要来自模块的资源但又不想处理实例化类带来的“浪费内存(泛化)”时,它很有用。这就像你为什么需要staticmethod?您本身并不需要它,但是将相关的东西放在一个地方会更整洁。

以上是关于为啥我应该在 python 中使用类方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我什至应该考虑在 C++ 中使用结构? [复制]

为啥从类中访问类变量需要“自我”。在 Python 中? [复制]

在 Python 中,为啥我不能为 str 类设置属性? [复制]

为啥我们应该将接口方法声明为公共的? [复制]

为啥我应该使用 Any 方法而不是 Count? [复制]

在 Python 中,为啥为没有定义超类的类调用 super() 函数不是错误? [复制]