python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python类方法和静态方法

Python中类方法@classmethod和静态方法@staticmethod解析

作者:goodxin_ie

这篇文章主要介绍了Python中类方法@classmethod和静态方法@staticmethod解析,python中存在三种方法,分别为常规方法(定义中传入self)、@classmethod修饰的类方法、@staticmethod修饰的静态方法,,需要的朋友可以参考下

一、python中的方法

python中存在三种方法,分别为常规方法(定义中传入self)、@classmethod修饰的类方法、@staticmethod修饰的静态方法。

class A(object):
    num = 0
    def __init__(self, index = 0):
        self.index = index 
    def foo(self, x):
        print("executing foo(%s,%s)" % (self, x))
        print('self:', self)
    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s,%s)" % (cls, x))
        print('cls:', cls.num)
    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)
a = A()

以上面的代码为例,其中存在三种类型的方法。

1.常规方法foo()

常规方法定义时需要传入self参数,与类的实例绑定。

也就是说调用时需要先实例化类,然后该实例才拥有foo()方法,通过A().foo()的方式来调用。

不能直接用类A.foo()的方式来调用。

2.类方法class_foo()

用@classmethod修饰的方法需要传入cls参数(代表当前类),表示该方法与类绑定(不是实例)

在该函数内部可以调用属于类的专有属性(一般来说定义在__init__外面的属性如上面的num)。

可以直接用A.class_foo()来调用,当然也可以直接实例化,通过实例来调用。

3.静态方法static_foo()

用@staticmethod修饰的方法不需要传入任何参数

该方法内部不能访问类或者实例的属性,相当于定义在类外面的普通方法。

可以直接用A.static_foo()来调用或者通过实例来调用。

二、@classmethod和@staticmethod的异同

相同点:

不同点:

三、使用场景

1.classmethod用在构造前交互(即类实例化之前),一般是用来实现特殊的构造函数。

e.g我们定义了Date类,需要提供day,month,year三个参数进行初始化。

class Date(object):
    day = 0
    month = 0
    year = 0
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

但是如果我们有很多 ('dd-mm-yyyy') 格式字符串的日期信息,想要把它们创建成 Date 类实例。

此时我们需要将 ('dd-mm-yyyy')转化成三个整形变量

然后 通过传递这些值实例化 Date。

我们当然可以在函数外面做转化的事,然后去实例化

如下:

day, month, year = map(date_as_string.split('-'))
date1 = Date(day, month, year)

但是很明显转化这个功能放在类里面美观一点,但是一般的方法需要类实例化之后(调用了__init__之后)才可以使用,因此这里需要使用@classmethod

class Date(object):
    day = 0
    month = 0
    year = 0
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year
    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1
date2 = Date.from_string('11-09-2012')

通过date2 = Date.from_string('11-09-2012')这样的方式就可以生成一个实例了。

2.某些不与实例交互的方法

不与实例交互就可以完成功能的方法虽然可以通过普通的实例化方法实现

但是实例化之后会浪费更多的时间与空间。

因此使用staticmethod。

ps:staticmethod方法和一个定义在lei外面的函数没啥区别,为了美观和整洁才移到函数里面的。

到此这篇关于Python中类方法@classmethod和静态方法@staticmethod解析的文章就介绍到这了,更多相关Python类方法和静态方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文