Python @staticmethod @classmetho

2018-05-16  本文已影响20人  Paycation

TL;DR

Normal Method (class)

class A:
    def show(self, s):
        print(self, s)
    def show_self(s):
        print(s)    

a = A()        

A.show(1, 2)
A.show_self(3) 
输出:
1 2
3

传入什么就是什么,没有任何特别之处。就像一个普通的函数。

Normal Method (instance)

class A:
    def show(self, s):
        print(self, s)
    def show_self(s):
        print(s)    

a = A()        

a.show(1)
a.show_self()
输出:
<__main__.A object at 0x1020e43c8> 1
<__main__.A object at 0x1020e43c8>

instance.method() 这种格式,默认第一个参数是 self (隐性参数),指代实例本身。所以即使括号无参数,也会输出实例本身。

@classmethod

class A:
    @classmethod
    def show(cls, s):
        print(cls, s)   

a = A()        

a.show(1)
A.show(2)
输出:
<class '__main__.A'> 1
<class '__main__.A'> 2

类似于普通方法会把第一个参数变成 self 指代实例本身,classmethod 会把方法的第一个参数变成 cls 指代类本身。如果是用实例调用,则效果和用类一样。
官方解释:A class method receives the class as implicit first argument, just like an instance method receives the instance.

@staticmethod

class A:
    @staticmethod
    def show(self, s):
        print(self, s)   

a = A()        

a.show(3, 4)
A.show(1, 2)

官方解释:A static method does not receive an implicit first argument. 说白了就是把方法变成彻底的普通方法,无论是类还是实例调用都不存在 self, cls 这种隐性参数。

上一篇 下一篇

猜你喜欢

热点阅读