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()   
  • 相关阅读:
    SQL 学习之路 (一)
    简单、易懂、通用的微信号、二维码轮播js
    本地phpstudy 新建站点运行步骤
    react-native 项目环境搭建
    JavaScript与DOM(下)
    JavaScript与DOM(上)
    ThisYes,this!
    编写高质量的JavaScript代码的基本要点
    变量对象(Variable Object)
    JavaScript核心
  • 原文地址:https://www.cnblogs.com/AndyChen2015/p/11430518.html
Copyright © 2011-2022 走看看