python3-staticmethod与classmethod

简介: classmethod:类方法 staticmethod:静态方法在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。

classmethod:类方法
staticmethod:静态方法

在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。

普通对象方法至少需要一个self参数,代表类对象实例

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。

对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少

classmethod必须使用类对象作为第一个参数,而staticmethod则可以不传递任何参数。

class Date:

    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(int,date_as_string.split('-'))
        my_date = cls(day, month, year)
        return my_date

    @staticmethod
    def is_date_valid(date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 3999


if __name__ == '__main__':
    my_date = Date.from_string('11-09-2012')
    print(my_date.day, my_date.month,my_date.year)
    is_date = Date.is_date_valid('13-13-2012')
    print(is_date)

outputs: 
11 9 2012
False

在来看另外的例子,为了验证有子类继承时,子类调用该类方法时,传入的类变量cls是子类,而非父类

class A:
    @classmethod
    def cm(cls):
        print('类方法cm(cls)调用者:', cls.__name__)

    @staticmethod
    def sm():
        print('静态方法sm()被调用')

class B(A):
    pass

A.cm()  # 类方法cm(cls)调用者: A
B.cm()  # 类方法cm(cls)调用者: B
A.sm()  # 静态方法sm()被调用
B.sm()  # 静态方法sm()被调用

下面我们来看为什么要用到staticmethod与classmethod。

class Kls:
    def __init__(self,data):
        self.data = data
    def printd(self):
        print(self.data)

ik1=Kls('arun')
ik2=Kls('seema')
ik1.printd()
ik2.printd()

# 如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢? 我们可以在类外面写一个简单的方法来做这些,
# 但是这样做就扩散了类代码的关系到类定义的外面. 如果像下面这样写就会导致以后代码维护的困难:
def get_no_of_instances(cls_obj):
    return cls_obj.no_inst
class Kls:
    no_inst = 0
    def __init__(self):
        Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print(get_no_of_instances(Kls)) # 2

应用classmethod

class Kls(object):
    no_inst = 0
    def __init__(self):
        Kls.no_inst = Kls.no_inst + 1
    @classmethod
    def get_no_of_instance(cls_obj):
        return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print(ik1.get_no_of_instance())
print(Kls.get_no_of_instance())
# 2
# 2

@staticmethod
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法

目录
相关文章
|
6月前
|
缓存 Java Python
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
|
6月前
|
SQL 分布式计算 算法
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用
|
6月前
|
Python
【零碎知识】【Python】@classmethod 与 @staticmethod
【零碎知识】【Python】@classmethod 与 @staticmethod
47 0
|
Python
Python @classmethod和@staticmethod装饰器使用介绍
Python @classmethod和@staticmethod装饰器使用介绍
85 0
|
Python
Python中三个装饰器函数用法(property、staticmethod、classmethod )
Python中三个装饰器函数用法(property、staticmethod、classmethod )
131 0
|
Java Python
python之 @staticmethod 和 @classmethod
python之 @staticmethod 和 @classmethod
156 0
python之 @staticmethod 和 @classmethod
|
Python
python小知识-classmethod类方法
类方法:@classmethod装饰的方法,参数有一个隐含参数cls,表示类本身,类可以直接调用
227 0
|
Python 缓存
Python装饰器abstractmethod、property、classmethod、staticmethod及自定义装饰器
总览: @abstractmethod:抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写 @ property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,...
3405 0
|
C# 开发者 Python
【开发者笔记】python中的类方法(@classmethod)和静态方法(@staticmethod)
在java、c#等高级语言中我们用static来定义静态方法和静态变量,那么在python中如何定义静态方法和静态变量呢。 python提供了@classmethod和@staticmethod来定义静态方法,刚接触的时候不太明白,Stack Overflow提供了一个比较方便理解的解释,Stack Overflow回答。
1683 0
|
Web App开发 测试技术 Python
Selenium2+python自动化55-unittest之装饰器(@classmethod)
前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。 于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。
1525 0
下一篇
无影云桌面