• @staticmethod和@classmethod 修饰符使用


    # -*- coding:utf-8 -*-

    # @staticmethod和@classmethod的用法

    """
    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法,
    而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
    既然如此,那他们俩又有什么区别呢?
    """
    # 从使用上看
    # @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样
    # @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数

    class A(object):
    bar = 1
    def foo(self):
    print('foo')

    @staticmethod
    def static_foo():
    print('static_foo')
    print A.bar

    @classmethod
    def class_foo(cls):
    print('class_foo')
    print cls.bar
    cls().foo()

    A.static_foo()
    A.class_foo()

    print('------')
    # 从实例第一个参数来看
    class kls(object):
    def __init__(self, data):
    self.data = data
    def printd(self):
    print(self.data)
    ik1 = kls('arun')
    ik2 = kls('seema')

    ik1.printd()
    ik2.printd()
    # 小结:第1,2步:参数传递给方法;第3步:self参数指向当前实例自身;第4步:python解释器运行代码

    # 与类交互而不是和实例交互的方法会是怎么样呢?代码难维护
    def get_no_of_instances(cls_obj):
    return cls_obj.no_inst
    class kls1(object):
    no_inst = 0
    def __init__(self):
    kls1.no_inst = kls1.no_inst + 1

    ik3 = kls1()
    ik4 = kls1()
    ik5 = kls1()
    print(get_no_of_instances(kls1)) # 调用的是类,传递的第一个参数是类,代码较分散

    print('-----')
    # 使用@classmethod装饰器来创建类方法
    class kls2(object):
    no_list = 0
    def __init__(self):
    kls2.no_list = kls2.no_list + 1
    @classmethod
    def get_no_of_instance(cls):
    return cls.no_list

    ik6 = kls2()
    ik7 = kls2()

    print(ik6.get_no_of_instance())
    print(ik7.get_no_of_instance())
    # 小结:使用实例调用,传的第一个参数也是类,代码较聚合

    print('------')
    # 经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法
    # 比如,更改环境变量或修改其他类的属性等能用到静态方法。这种情况可以直接使用函数解决,但这样同样会扩散类内部的代码,造成维护困难
    IND = 'ON'
    # def checkid():
    # return(IND == 'ON')
    class kls3(object):
    def __init__(self, data):
    self.data = data
    @staticmethod
    def checkid():
    return(IND == 'ON')
    def do_reset(self):
    if self.checkid():
    print('Reset done for:', self.data)
    def set_db(self):
    if self.checkid():
    self.db = 'new db connection'
    print('DB connection made for:', self.data)

    ik8 = kls3(12)
    ik8.do_reset()
    ik8.set_db()

    print('-----')

    # @staticmethod,@classmethod使用的不同
    class kls4(object):
    def __init__(self, data):
    self.data = data
    def printd(self):
    print(self.data)
    @staticmethod
    def smethod(*arg):
    print('Static:', arg)
    @classmethod
    def cmethod(*arg):
    print('Class:', arg)
    ik9 = kls4(23)
    ik9.printd()
    ik9.smethod(1)
    ik9.cmethod(2)

    本文来自博客园,作者:ReluStarry,转载请注明原文链接:https://www.cnblogs.com/relustarry/p/15470838.html

  • 相关阅读:
    f2fs源码解析(五) node管理结构梳理
    没有什么好神秘的: wait_on_page_bit
    write_back 浅浅分析
    f2fs解析(六)
    转载软件需求文档标准格式
    转载 如何设计一个优秀的数据库
    转载 MySQL创建表的语句 示例
    equals和==的区别 (Java基础)
    转载 【Linux】Linux中常用操作命令
    windows 注册表
  • 原文地址:https://www.cnblogs.com/relustarry/p/15470838.html
Copyright © 2020-2023  润新知