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
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法

目录
相关文章
|
8天前
|
Python
Python中,hasattr()函数的详细介绍以及使用
`hasattr()`是Python内置函数,用于检测对象是否具有特定属性或方法。它接受对象和属性名作为参数,返回布尔值。通过`hasattr()`,我们可以在运行时动态检查对象能力,增强代码灵活性。文章详细阐述了`hasattr()`的基本概念、用法,对比了它与`getattr()`的区别,并提供了示例及扩展应用,强调其在处理动态对象和属性时的重要性。使用`hasattr()`可以避免`AttributeError`,优化条件判断和接口检查,实现动态调用方法。
25 0
|
8月前
Python-staticmethod静态方法
Python-staticmethod静态方法
39 0
|
6月前
|
关系型数据库 MySQL Python
python3中,isinstance() 函数
​isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。 返回值:如果对象的类型与参数二的类型相同则返回True,否则返回False 使用isinstance函数的实例: ```python a=2 print(isinstance(a,int))                # returns True print(isinstance(a,str))                # returns False print(isinstance(a,(str,int,list)))     # returns True ``` 拓展:
21 0
|
8月前
|
Python
Python内置函数--getattr&setattr&delattr&hasattr
Python内置函数--getattr&setattr&delattr&hasattr
33 0
|
10月前
|
存储 Python
Python 元类(metaclass)
Python面向对象编程的高级知识点——元类(metaclass)
37 0
|
12月前
|
Python
Python @classmethod和@staticmethod装饰器使用介绍
Python @classmethod和@staticmethod装饰器使用介绍
62 0
|
Python
Python中三个装饰器函数用法(property、staticmethod、classmethod )
Python中三个装饰器函数用法(property、staticmethod、classmethod )
101 0
|
Python
Python中hasattr的具体用法
hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。需要注意的是name要用引号括起来
83 0
|
Python
python小知识-classmethod类方法
类方法:@classmethod装饰的方法,参数有一个隐含参数cls,表示类本身,类可以直接调用
202 0
|
Java Python
python之 @staticmethod 和 @classmethod
python之 @staticmethod 和 @classmethod
115 0
python之 @staticmethod 和 @classmethod