Python中@classmethod的用途是什么?
我目前正在学习Python。在OOP中,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?如
@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中是至关重要的。