前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 面向对象之静态方法

python 面向对象之静态方法

作者头像
py3study
发布2018-08-02 16:41:32
4760
发布2018-08-02 16:41:32
举报
文章被收录于专栏:python3python3

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

举个例子:

代码语言:javascript
复制
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方法变成静态方法:

代码语言:javascript
复制
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参数

代码语言:javascript
复制
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去掉

代码语言:javascript
复制
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给传进去

代码语言:javascript
复制
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()

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

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

总结:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档