为什么要在 python 中使用类方法?
Why should I use a classmethod in python?
我正在 python 中的某些 class 中编写一个函数,人们建议我向该函数添加一个 @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
装饰器有什么好处?
如果您看到 _randomize
方法,则您没有在其中使用任何实例变量(在 init 中声明),但它使用的是 class 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))
这意味着,你的方法可以不作为实例方法而存在,你可以直接在class上调用它。
Randomize._randomize()
那么问题来了,它有什么优势吗?
我想是的,您不必通过创建实例来使用此方法,这会产生开销。
ran = Randomize() // Extra steps
ran._randomize()
您可以阅读有关 class 和实例变量 here 的更多信息。
我正在 python 中的某些 class 中编写一个函数,人们建议我向该函数添加一个 @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
装饰器有什么好处?
如果您看到 _randomize
方法,则您没有在其中使用任何实例变量(在 init 中声明),但它使用的是 class 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))
这意味着,你的方法可以不作为实例方法而存在,你可以直接在class上调用它。
Randomize._randomize()
那么问题来了,它有什么优势吗?
我想是的,您不必通过创建实例来使用此方法,这会产生开销。
ran = Randomize() // Extra steps ran._randomize()
您可以阅读有关 class 和实例变量 here 的更多信息。