发布时间: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()
在特殊场景可能会用到,大多数情况下,用不到。但是你要知道静态方法,面试必考。
静态方法不一定放到类的最下面,它可以放到任意位置。
总结:
静态方法只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
上一篇: python 面向对象之多态
下一篇: python 面向对象之类方法
47744
46234
37109
34626
29228
25885
24744
19862
19415
17907
5715°
6314°
5834°
5887°
6983°
5829°
5845°
6360°
6315°
7672°