python 面向对象之静态方法

发布时间:2018-04-07 20:31:19编辑:admin阅读(4713)

    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法


    举个例子:

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self,food): #吃东西
            print("%s is eating %s" % (self.name,food))
    
    
    d = Dog("二哈")
    d.eat('包子')

    执行输出:

    二哈 is eating 包子


    将eat方法变成静态方法:

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @staticmethod  # 把eat方法变为静态方法
        def eat(self,food): #吃东西
            print("%s is eating %s" % (self.name,food))
    
    
    d = Dog("二哈")
    d.eat('包子')

    执行报错:

    TypeError: eat() missing 1 required positional argument: 'food'

    意思是eat()方法缺少1个位置参数:'food'


    怎么会少呢?明明传了啊!

    为了方便排错,去掉food参数

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @staticmethod  # 把eat方法变为静态方法
        def eat(self): #吃东西
            print("%s is eating" % (self.name))
    
    
    d = Dog("二哈")
    d.eat()

    执行报错:

    TypeError: eat() missing 1 required positional argument: 'self'

    意思是少了一个位置参数self


    在类方法调用的时候,self会被自动传进去,不需要手动传。但现在很显然是没有传,因为它提示少了。

    注意,这就是静态方法的作用。

    静态方法实际上跟类没有关系了,相当于把类的关联截断的。它的作用,只是一个单纯的函数。

    它和类唯一的关系就是,它必须通过类调用才行。就相当于它是类的下一级,在名义上来讲,它是类的一部分。


    把self去掉

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @staticmethod  # 把eat方法变为静态方法
        def eat(): #吃东西
            print("%s is eating" % ('二哈'))
    
    
    d = Dog("二哈")
    d.eat()

    执行输出:

    二哈 is eating


    如果一定要self呢?需要把d给传进去

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @staticmethod  # 把eat方法变为静态方法
        def eat(self): #吃东西
            print("%s is eating" % (self.name))
    
    
    d = Dog("二哈")
    d.eat(d)

    执行输出:

    二哈 is eating


    但是这样做,把它变成静态方法,就没有意义了


    静态方法,相当于一个工具包,它和其他类没有任何关联。当需要它的之后,调取一下,就可以了

    相当于os.system()和os.mkdir()

    在特殊场景可能会用到,大多数情况下,用不到。但是你要知道静态方法,面试必考。


    静态方法不一定放到类的最下面,它可以放到任意位置。


    总结:

    静态方法只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。



关键字