@staticmethod和@classmethod的作用与区别

一般情况,要使用某个类的方法,需要先实例化一个对象再调用方法。

而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看,

-

@staticmethod 不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

-

@classmethod 也不需要self参数,但第一个参数需要是表示自身类的cls参数。

-

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

-

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

-

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像Test.foo()

如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。

代码示例:

#!/usr/local/python3/bin/python3

class Door(object):
    a = 1
    def __init__(self,num,status):
        self.num = num
        self.status = status
    def open(self):
        self.var = 0
        self.status = ‘open‘
    def close(self):
        self.status = ‘closed‘
    def __test(self):
        print (‘__test‘)

    @classmethod
    def test(cls):
        print("class test")
#不需要self参数,但第一个参数需要是表示自身类的cls参数。        
        print(cls.a)

    @staticmethod
    def test2():
        print("static test2")
#不需要自身对象参数,直接使用类名+类变量调用        
        print(Door.a)
        
Door.test()
d1 = Door(1,"closed")
d1.test()
#通过类名调用和通过实例调用
d2 = Door(2,"closed")
Door.test2()
d2.test2()

输出结果:

时间: 2024-08-08 09:40:29

@staticmethod和@classmethod的作用与区别的相关文章

python @staticmethod和@classmethod的作用与区别

class test: class_name = "test" def __init__(self, name): self.class_name = name def my_print(self, value): print(value + " " +self.class_name) @staticmethod def my_static_print(val): print(val) @classmethod def my_class_print(cls, val

飘逸的python - @staticmethod和@classmethod的作用与区别

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁. 既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢 从它们的使用上来看, @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. @cla

Python中@staticmethod和@classmethod的作用和区别

相同之处:@staticmethod 和@classmethod 都可以直接类名.方法名()来调用,不用在示例化一个类. @classmethod 我们要写一个只在类中运行而不在实例中运行的方法.如果我们想让方法不在实例中运行,可以这么做: def iget_no_of_instance(ins_obj): return ins_obj.__class__.no_inst class Kls(object): no_inst = 0 def __init__(self): Kls.no_inst

Python - 静态函数(staticmethod), 类函数(classmethod), 成员函数 区别(完全解析)

原文地址:http://blog.csdn.net/caroline_wendy/article/details/23383995 静态函数(staticmethod), 类函数(classmethod), 成员函数的区别(完全解析) 定义: 静态函数(@staticmethod): 即静态方法,主要处理与这个类的逻辑关联, 如验证数据; 类函数(@classmethod):即类方法, 更关注于从类中调用方法, 而不是在实例中调用方法, 如构造重载; 成员函数: 实例的方法, 只能通过实例进行调

知识点 - python 装饰器@staticmethod和@classmethod区别和使用

1.通常来说,我们使用一个类的方法时,首先要实例化这个类,再用实例化的类来调用其方法 class Test(object): """docstring for Test""" def __init__(self, arg=None): super(Test, self).__init__() self.arg = arg def say_hi(self): print('hello wrold') def main(): test = Test(

Python中的staticmethod和classmethod

在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法. 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例. 普通对象方法至少需要一个self参数,代表类对象实例 类方法有类变量cls传入,从而可以用cls做一些相关的处理.并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类. 对于类方法,可以通过类来调用,就像C.

Python中的staticmethod和classmethod 的异同

class MethodTest(): var1 ="class var" def__init__(self, var2 = "object var"): self.var2 = var2 @staticmethod defstaticFun(): print'static method' @classmethod defclassFun(cls): print 'class method' staticmethod和classmethod的相同点: 1.都可以通过

@staticmethod与@classmethod的异同点

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁. 既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢 从它们的使用上来看, @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. @cla

BeanFactory和ApplicationContext的作用和区别

BeanFactory和ApplicationContext的作用和区别 作用: 1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期. 2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: a. 国际化支持b. 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”),