Python中@classmethod的用途是什么?

Python中@classmethod的用途是什么?,python,class,class-variables,Python,Class,Class Variables,我目前正在学习Python。在OOP中,@classmethod装饰器的用途是什么?通过@classmethod访问类变量和通过普通方法访问类变量有什么区别?我可以这样做: class A(): _变量=A def getVariable(自): 返回self.\u变量 或 class A(): _变量=A @类方法 def getVariable(cls): 返回cls.\u变量 这两种方法的区别是什么?为什么我需要在何时使用classmethod以及何时不必使用classmethod?如

我目前正在学习Python。在OOP中,
@classmethod
装饰器的用途是什么?通过
@classmethod
访问类变量和通过普通方法访问类变量有什么区别?我可以这样做:

class A():
_变量=A
def getVariable(自):
返回self.\u变量

class A():
_变量=A
@类方法
def getVariable(cls):
返回cls.\u变量

这两种方法的区别是什么?为什么我需要在何时使用classmethod以及何时不必使用classmethod?如果我不这样做会怎么样?

当使用类和实例变量/方法时,您关心的是可见性

类的所有实例都共享一个类变量/方法,而实例变量/方法仅对您现在拥有的实例可用

一般来说,实例变量用于每个实例特有的数据,类变量用于类的所有实例共享的属性和方法:

class狗:
种类='canine'#所有实例共享的类变量
定义初始化(self,name):
self.name=name#每个实例唯一的实例变量
>>>d=狗(‘Fido’)
>>>e=狗(“伙伴”)
>>>d.种类——所有狗都有
“犬科动物”
>>>e.善良——所有的狗都有
“犬科动物”
>>>d.name#对d唯一
“菲多”
>>>e.name#唯一于e
“伙计”
这个示例没有向您展示的是,使用类方法,您可以在不经过实例的情况下调用类上的方法

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

    @classmethod
    def isGoodBoy(cls):
        return True  # all dogs are good boys!
现在,
isGoodBoy
方法不需要访问狗的名称,因此它可以是一个类方法,这反映在所有实例上;毕竟,所有的狗都是好男孩(和女孩!)

但这告诉你更多!狗是好孩子吗?我们是否要求任何特定的狗成为一个好孩子

>Dog.isGoodBoy()#这里我们调用类上的方法
是的,争论解决了!
现在再回答四个问题;在处理类而不是对象时,最好使用类方法。在创建记录器实例之前,如何知道它是否需要网络?这就是类方法和类变量的用途,以及该类的所有对象的公共状态和行为

由于这是在所有类之间共享的,您现在还有其他问题,因此该类的每个实例都可能修改该类变量!这也意味着您可以在没有对象的情况下查询变量值

假设您希望在运行时从方法A切换到方法B


Foo类:
升级=错误
def a(自我):
...
def b(自我):
...
def运行(自):
self.a()如果self.else升级self.b())

现在一个
Foo.upgrade=True
将为每个人切换内容!或者最好通过运行
dog.kind='feline'

@classmethod定义以下方法是静态的,属于类而不是对象

因此,带有@classmethod的方法不能访问对象的任何值,但是可以在不初始化该类的对象的情况下调用它

一个用例是:

class Test:
    @classmethod
    def foo(cls, a, b):
        # do smth

Test.foo(1, "abc")

我也推荐这些:请修改格式:正确的缩进在Python中是至关重要的。