zoukankan      html  css  js  c++  java
  • 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()   
  • 相关阅读:
    Linux手动安装Apache2.4
    Linux 定时任务 crontab
    微信小程序 wxs 使用正则替换字符串
    腾讯云 远程通过端口3306访问MYSQL数据库
    微信小程序点击内容展开隐藏评论文章等
    SGA设置
    oracle 序列
    oracle中lnnvl函数
    union 中null值合并原理
    oracle 事务读一致性(一)
  • 原文地址:https://www.cnblogs.com/AndyChen2015/p/11430518.html
Copyright © 2011-2022 走看看