普通方法,静态方法和类方法


著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:李保银
链接:http://www.zhihu.com/question/20021164/answer/18224953
来源:知乎

这个答案的原文是 Difference between @staticmethod and @classmethod in Python
这里的内容是我通知原作者并得到允许的情况下的翻译稿
这个是我的博客文章的地址 pyhton静态方法和类方法
类中最常用的方法是实例方法, 即通过通过实例作为第一个参数的方法。
举个例子,一个基本的实例方法就向下面这个:

 
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()

这会给出如下的输出:
arun
seema

<img src="https://i-blog.csdnimg.cn/blog_migrate/a2da98aec2debf51ff6c6cc7ef75f154.png" data-rawwidth="372" data-rawheight="322" class="content_image" width="372">

然后看一下代码和示例图片:
  • 1,2参数传递给方法.
  • 3 self参数指向当前实例自身.
  • 4 我们不需要传递实例自身给方法,Python解释器自己会做这些操作的.
如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢 ? 我们可以在类外面写一个简单的方法来做这些,但是这样做就扩散了类代码的关系到类定义的外面 . 如果像下面这样写就会导致以后代码维护的困难:

 
def get_no_of_instances(cls_obj):
    return cls_obj.no_inst
class Kls(object):
    no_inst = 0
    def __init__(self):
        Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print(get_no_of_instances(Kls))

输出:
2
@classmethod
我们要写一个只在类中运行而不在实例中运行的方法 . 如果我们想让方法不在实例中运行,可以这么做:

 
def iget_no_of_instance(ins_obj):
    return ins_obj.__class__.no_inst
class Kls(object):
    no_inst = 0
    def __init__(self):
    Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print iget_no_of_instance(ik1)

输出
2
在Python2.2以后可以使用@classmethod装饰器来创建类方法 .

 
class Kls(object):
    no_inst = 0
    def __init__(self):
        Kls.no_inst = Kls.no_inst + 1
    @classmethod
    def get_no_of_instance(cls_obj):
        return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()

输出:
2
2
这样的好处是: 不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来 .
@staticmethod
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法 . 比如更改环境变量或者修改其他类的属性等能用到静态方法 . 这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难 .
比如这样:

 
IND = 'ON'
def checkind():
    return (IND == 'ON')
class Kls(object):
     def __init__(self,data):
        self.data = data
def do_reset(self):
    if checkind():
        print('Reset done for:', self.data)
def set_db(self):
    if checkind():
        self.db = 'new db connection'
        print('DB connection made for:',self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()

输出:
Reset done for: 12
DB connection made for: 12
如果使用@staticmethod就能把相关的代码放到对应的位置了 .
 
IND = 'ON'
class Kls(object):
    def __init__(self, data):
        self.data = data
    @staticmethod
    def checkind():
        return (IND == 'ON')
    def do_reset(self):
        if self.checkind():
            print('Reset done for:', self.data)
    def set_db(self):
        if self.checkind():
            self.db = 'New db connection'
        print('DB connection made for: ', self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()

输出:
Reset done for: 12
DB connection made for: 12
下面这个更全面的代码和图示来展示这两种方法的不同
@staticmethod 和 @classmethod的不同

 
class Kls(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)
 
>>> ik = Kls(23)
>>> ik.printd()
23
>>> ik.smethod()
Static: ()
>>> ik.cmethod()
Class: (<class '__main__.Kls'>,)
>>> Kls.printd()
TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)
>>> Kls.smethod()
Static: ()
>>> Kls.cmethod()
Class: (<class '__main__.Kls'>,)

下面这个图解释了以上代码是怎么运行的:
&amp;lt;img src="https://i-blog.csdnimg.cn/blog_migrate/9fd31330cb92e7f074e80c19f1ecb09a.png" data-rawwidth="563" data-rawheight="324" class="origin_image zh-lightbox-thumb" width="563" data-original="https://pic3.zhimg.com/8a82a7f295c855c39b0d21f5bb1352c2_r.jpg"&amp;gt;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,静态方法方法是两种不同型的方法,它们都属于方法,不需要实例化就可以调用。它们的区别主要在于它们的参数和使用方式。 静态方法中的一个普通函数,它与的实例和本身没有任何关联。它有一个装饰器 @staticmethod,用来指示这个方法是一个静态方法静态方法没有默认参数 self 或 cls,因此它不能访问或实例的任何属性,也不能修改它们。静态方法主要用来执行一些与有关的任务,但不需要访问或修改或实例的属性。例如,一个与有关的辅助函数。 方法中的一个特殊函数,它使用装饰器 @classmethod 来指示这个方法是一个方法方法第一个参数是 cls,它指的是当前对象。方法可以访问的属性和方法,也可以修改它们。方法主要用来执行一些与有关的任务,例如,创建一个新的实例对象。 下面是一个静态方法方法的示例: ```python class MyClass: def __init__(self, x): self.x = x @staticmethod def static_method(): print("This is a static method.") @classmethod def class_method(cls): print("This is a class method.") return cls(0) ``` 在此示例中,我们定义了一个名为 MyClass 的,并定义了一个静态方法 static_method 和一个方法 class_method。静态方法不需要参数,而方法需要一个参数 cls。在 class_method 中,我们创建了一个新的 MyClass 对象并返回它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值