zoukankan      html  css  js  c++  java
  • @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

  • 相关阅读:
    国庆七天乐——第二天
    国庆七天乐——第一天
    线段树+树状数组+分块+循环展开 的模板
    AOE网络——求关键路径
    最小生成树模板+并查集(隐藏)+结构体排序模板
    并查集模板
    最短路径模板总结
    newifi mini将led指示灯引出当gpio使用
    openwrt 无线中继
    笔记本硬盘盒改装台式机硬盘盒
  • 原文地址:https://www.cnblogs.com/relustarry/p/15470838.html
Copyright © 2011-2022 走看看