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()   
  • 相关阅读:
    04.网站点击流数据分析项目_模块开发_数据仓库设计
    03.网站点击流数据分析项目_模块开发_数据预处理
    02.网站点击流数据分析项目_模块开发_数据采集
    15_sqoop数据导出
    14_sqoop数据导入
    13_sqoop数据迁移概述
    12_Azkaban案例实践5_Command操作Hive脚本任务
    11_Azkaban案例实践4_Command操作MapReduce
    10_Azkaban案例实践3_Command操作HDFS
    09_Azkaban案例实践2_Command多job工作流flow
  • 原文地址:https://www.cnblogs.com/AndyChen2015/p/11430518.html
Copyright © 2011-2022 走看看