python classmethod()是Python标准库中的一个内置方法。在Python中,有三种类型的方法,分别是:实例方法、类方法和静态方法。
这篇文章首先介绍一下类方法的含义及使用方法。
在Python中,类方法是可以使用类名直接调用的方法,类方法可以在类的所有对象中进行共享。classmethod()方法可以把类中的一个方法转化为类方法,但要求类中定义的那个方法的第一个参数是 cls ,当然这只是约定俗成的,使用其他标识符也可以,主要用于隐式的表示类自身,以调用类的属性、方法,以及实例化对象等,这点与实例方法中的 self 参数相似。
类方法即可以使用类来调用(如C.f()),又可以使用类的实例来调用(如C().f())。如果类方法由派生类来调用,则派生类的对象将作为classmethod()的第一个参数。
Python中的类方法与Java、C#等中的静态方法不同,这些问题将在今后的文章中进行探讨。
该方法的语法格式如下:
classmethod(function)
function:用于指定类中转换为类方法的方法名称,当然也应该包含类名。
该函数没有返回值。
下面使用实例来说明classmethod()方法的具体使用过程。
class Hello:
word = "你好"
def SayHello(cls):
print(cls.word)
#定义一个实例
h = Hello()
#实例调用SayHello
h.SayHello()
#Hello.SayHello() #这时使用会报错
#将SayHello指定为类方法
Hello.SayHello= classmethod(Hello.SayHello)
#用实例来调用
h.SayHello() #你好
#用类方法
Hello.SayHello() #你好
#用实例修改word的值
h.word="关注:优雅的代码"
h.SayHello() #你好
Hello.SayHello() #你好
#用类名修改word的值
Hello.word="优雅的代码"
h.SayHello() #优雅的代码
Hello.SayHello() #优雅的代码
输出结果如下:(上面代码为了让大家看得清楚,使用注释方法也注释了输出内容。)
你好
你好
你好
你好
你好
优雅的代码
优雅的代码
从上面的代码及输出结果可以看出:
(1)类方法中可以访问类的变量和方法;
(2)类方法可以使用类名调用,也可以使用类的实例调用;
(3)把一个方法转换成类方法后,使用实例调用时只能读取类共享的变量值,无法获取实例的变量值;
(4)类方法不能获取实例的变量值,只能读取类共享的变量值,即类变量的默认值或使用类名调用变量修改的值。
下面再看一个例子:
class Hello:
word = "你好"
def SayHello(self):
print(self.word)
def Say(cls, w):
cls.word = w
cls.SayHello()
Hello.SayHello = classmethod(Hello.SayHello)
Hello.Say = classmethod(Hello.Say)
Hello.SayHello()
Hello.Say("欢迎关注微信订阅号:优雅的代码")
输出结果如下所示:
你好
欢迎关注微信订阅号:优雅的代码
这段代码主要演示类方法带有其它参数的情况。
classmethod()方法是在Python 2.2版本加进来的,但很明显这种定义类方法的过程还是很麻烦,在Python2.4版本中使用方法修饰符的方法来实现,即在类中需要定义类方法上面使用@classmethod修饰符来指定该方法为类方法。其基本语法格式如下:
class className:
@classmethod
def funname(cls, arg1,arg2,...):
#方法的相关代码
上面的@classmethod是funname()方法的修饰符,它指示funname()是一个类方法。下面看一个具体的例子:
class Student:
age = 23
@classmethod
def printAge(cls):
print(cls.age)
Student.printAge()
输出结果:
23
使用@classmethod修饰符指定的类方法与上面所讲的要求相同。
以上讲解了关于Python中classmethod()方法和@classmethod修饰符的作用,如有问题,欢迎留言。
新闻热点
疑难解答