@staticmethod 或 @classmethod

https://blog.csdn.net/reallocing1/article/details/53394697

@classmethod     

 -  这个方法(即函数)的()里的参数可以是这个类。

 -   把这个方法(即函数)挪到类的外面也是可行的。

 @staticmethod:

有一些和类相关函数,但不要使用该类或者该类的实例;比如更改环境变量或者修改其他类的属性等。

 

notice: classmethod需要一个对类的引用作为第一个参数,而staticmethod不需要。

 

 https://blog.csdn.net/weixin_33856370/article/details/90993824 (三句话解释)

    • @property
      这个装饰器可以让你用直接「实例名.属性」来读和改写属性,表面看去是取值或用「=」来赋值,其内核却是调用get或者set方法,其用法是直接修饰在get方法前面,或者在set方法前面用@方法名.setter

    • @staticmethod
      目前为止见过的所有类中的函数都要传入self这个实例。顾名思义,静态方法,@staticmethod可以修饰不需要self的函数,这类函数不加@staticmethod的话报错

    • @classmethod
      顾名思义,类方法,用它来修饰的方法,其第一个参数不是self,而是cls,也就是这个类本身作为参数

 

 

https://blog.csdn.net/weixin_43613053/article/details/84979916

一、@classmethod
类方法,不需要实例化,也不需要self参数,需要一个cls参数,可以用类名调用,也可以用对象来调用。

原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,那么这个方法就可以定义为类方法

二、@staticmethod
静态方法,不需要实例化,不需要self和cls等参数,就跟使用普通的函数一样,只是封装在类中

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

注意点:
使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名
@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

三、@property
属性方法,主要作用是将一个操作方法封装成一个属性,用户用起来就和操作普通属性完全一致,非常简单.定义时,在实例方法的基础上添加@property装饰器,并且只有一个self参数,调用时,不需要括号

@property 是经典类中的一种装饰器,新式类中具有三种:
1.@property获取属性
2.@方法名.setter 修改属性
3.@方法名.deleter 删除属性

总结:类方法,是直接对类操作时候定义的,实例化方法是操作实例化对象时候定义的,静态方法与类无关,就是独立的逻辑单元。@property是将方法转为属性,直接可使用其返回值,提供了可读可写可删除的操作,如果像只读效果,就只需要定义@property就可以,不定义代表禁止其他操作。

 

另:

转载于 https://blog.csdn.net/u010180339/article/details/9615239

 

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

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

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

 

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

从它们的使用上来看,
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

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

而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

下面上代码。
  

class A(object):
    bar = 1
    def foo(self):
        print 'foo'
 
    @staticmethod
    def static_foo():
        print 'static_foo'
        print A.bar
 
    @classmethod
    def class_foo(cls):
        print 'class_foo'
        print cls.bar
        cls().foo()
 
A.static_foo()
A.class_foo()

 

 

输出
static_foo
1
class_foo
1
foo

posted on 2018-12-21 15:38  cdekelon  阅读(152)  评论(0)    收藏  举报

导航