zoukankan      html  css  js  c++  java
  • @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的实例,无法使用类的属性。

  • 相关阅读:
    set命令_Linux
    AngularJS的date 过滤器
    JMeter环境介绍
    JMeter测试计划要素
    HTTP协议的压缩及URL Encode
    fiddler配置及使用教程
    Slenium常用方法
    Selenium八大定位
    CSS实现上下左右垂直居中
    SASS用法笔记
  • 原文地址:https://www.cnblogs.com/bellumpara/p/9562544.html
Copyright © 2011-2022 走看看