python3 @classmethod 和 @staticmethod 的区别

如果您将某个东西定义为classmethod,这可能是因为您打算从类而不是类实例中调用它。

定义类方法的几种方式:

  1. 常规方式                         : 需要self隐士传递当前类对象的实例。
  2. @classmethod 装饰器修饰  :需要通过cls参数传递当前类对象
  3. @staticmethod  装饰器修饰 :与普通函数是一样
class A(object):
    def foo(self, x):
        print("executing foo(%s, %s)" % (self, x))

    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s, %s)" % (cls, x))

    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)

a = A()

调用说明

#类中方法均可通过:对象实例.方法() 访问
a.foo(1)        #executing foo(<__main__.A object at 0x0000000001E9B488>, 1)
a.class_foo(2)  #executing class_foo(<class '__main__.A'>, 2)
a.static_foo(3) #executing static_foo(3)

#@classmethod修饰方法调用: 类对象或对象实例调用
A.class_foo(4) #executing class_foo(<class '__main__.A'>, 4)
a.class_foo(5) #executing class_foo(<class '__main__.A'>, 5)

# 通过类对象 访问常规方法即没有修饰符的方法
A.foo(a,6) #executing foo(<__main__.A object at 0x000000000284C488>, 6)

其他案例:

class A(object):
    def __init__(self,name):
        self.name = name

    def foo(self, x):
        print("executing foo(%s, %s, %s)" % (self, x,self.name))

    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s, %s)" % (cls, x))
        # 返回一个实例对象
        return cls(x)

    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % x)

dd = A.class_foo(2) # executing class_foo(<class '__main__.A'>, 2)
print(dd.name)      # 2
dd.foo(3)           # executing foo(<__main__.A object at 0x0000000001E8B708>, 3, 2)

 

class CeShi:
    name = '测试'
    def __init__(self,x,y):
        self.x = x
        self.y = y

    @property           #在CeShi_add函数前加上@property,使得该函数可直接调用,封装起来
    def CeShi_add(self):
        return self.x + self.y

                        #在CeShi_info函数前加上@classmethon,则该函数变为类方法,
    @classmethod        #该函数只能访问到类的数据属性,不能获取实例的数据属性
    def CeShi_info(cls):  #python自动传入位置参数cls就是类本身
        print('这是一个%s'%cls.name)   #cls.CeShi_name调用类自己的数据属性

CeShi.CeShi_info()   

 

posted @ 2019-08-29 16:41  猪快跑  阅读(652)  评论(0编辑  收藏  举报