• @classmethod 和 @staticmethod


    1. 定义:

    @classmethod: 当调用此方法时,将类作为第一个参数而不是该类的实例传递(正如我们通常使用的方法)。这意味着可以在该方法中使用类及其属性,而不是特定实例。

    @staticmethod: 当调用此方法时,不会将类的实例传递给它(正如我们通常使用的方法)。这意味着可以将一个函数放在一个类中,但该函数无法访问该类的实例(当您的方法不使用该实例时,这很有用)。

    2. 相同与差异

      @classmethod @staticmethod
    相同

    调用方式;

    可以通过实例或者其本身调用

    class C:

    @classmethod

    def f(cls, arg1, arg2,...):

      pass

    可以用一下方式调用

    C.f() 或者 C().f()

    调用方式;

    可以通过实例或者其本身调用

    class C:

    @staticmethod

    def f(cls, arg1, arg2,...):

      pass

    可以用一下方式调用

    C.f() 或者 C().f()

    不同   

     继承支持:

    定义通过继承可改变

     继承支持:

    定义通过继承不可改变

     对象参数传递:

    必须通过隐式传递(cls

     对象参数传递:

    N/A

    3. 案例

    Class Date(object):
        def __init__(self, day=0, month=0, year=0):        
            self.day = day
            self.month = month
            self.year = year
    
        @classmethod
        def from_string(cls, date_as_string):
            day, month, year = map(int, date_as_string.split('-'))
            date1 = cls(day, month, year)
            return date1
    
        @staticmethod
        def is_date_valid(date_as_string):
            day, month, year = map(int, date_as_string.split('-'))
            return day <= 31 and month <= 12 and year <= 3999
    
    date2 = Date.from_string('11-09-2012')
    is_date = Date.is_date_valid('11-09-2012')
    
    isinstance(date2, Date) #True
    isinstance(is_date, Date) #False
    
    date2.month  # 9
    is_date.month # AttributeError: 'bool' object has no attribute 'month'            
    

      

       类Date用来存储某一天的日期信息。

      @classmethod 实现功能(date字符串的解析),并且被封装到类Date中,且继承Date的子类也可以调用。

      @staticmethod 实现功能(验证日期),但is_date并不是Date的实例,无法使用类的属性。

  • 相关阅读:
    Python常见问题
    经典SQL语句大全(转)
    VMware ESX常用命令
    每天一个linux命令(目录)
    Linux 技巧:让进程在后台可靠运行的几种方法(转)
    软件测试随手记(转)
    linux下查看磁盘空间
    MQ5.3在redhat9上的安装
    我的MQ笔记
    RedHat Linux下MQ安装步骤及MQ常用命令
  • 原文地址:https://www.cnblogs.com/bellumpara/p/9562544.html
Copyright © 2020-2023  润新知