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的实例,无法使用类的属性。

  • 相关阅读:
    php中如何实现在线网友
    用php与mysql的电子贺卡代码
    基于PHP MySQL的聊天室设计
    xml php动态载入与分页
    模拟OICQ的实现思路和核心程序
    FC4下安装plog快速指南(plog版本:1.01)
    一个简单的php在线端口扫描器
    UVA 10604 Chemical Reaction(六维dp数组)
    HDU 1503 Advanced Fruits
    hust 1607 Triangles(经典好题)
  • 原文地址:https://www.cnblogs.com/bellumpara/p/9562544.html
Copyright © 2011-2022 走看看