静态方法
一、什么是静态方法
普通的方法可以在实例化后直接调用,并且在方法里可以通过self.xxx调用实例变量或类变量,而静态方法是不可以访问实例变量或类变量,一个不能访问实例变量和类变量的方法,实际上已经和类本身没什么关系了。唯一与类有关联的就是有需要通过类名来调用这个方法。
二、如何使用静态方法
通过@staticmethod装饰器把需其装饰的方法即可变成一个静态方法。
# _*_ coding:utf-8 _*_ class Dog(object): def __init__(self, name): self.name = name @staticmethod # 属于类的一种方法,但无法访问类或实例的属性 def eat(self, food): print("%s is eating %s" % (self.name, food)) def talk(self): print("%s is talking." % self.name) dog = Dog("Tom") # 当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self dog.eat("Apple") # TypeError: eat() missing 1 required positional argument: 'food' # 正确的姿势 dog.eat(dog, "Apple") 再看看这个例子: class Dog(object): name = "JACK" def __init__(self, name): self.name = name @staticmethod def eat(name, food): print("%s is eating %s" % (name, food)) def talk(self): print("%s is talking." % self.name) dog = Dog("Tom") # 当作普通方法使用,传入位置参数 dog.eat("Jack", "Apple") # 直接通过类名调用 Dog.eat("Jerry", "HotDog")
类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。
class Dog(object): def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" %(self.name, food)) @classmethod def talk(self): print("%s is talking." % self.name) dog = Dog("Tom") dog.eat('apple') dog.talk() # 此时调用会报错,提示没有name这个属性。 再来看下面的代码: class Dog(object): name = "Jack" def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" %(self.name, food)) @classmethod def talk(self): print("%s is talking." % self.name) dog = Dog("Tom") # 实例化一只叫Tom的狗 dog.talk() Jack is talking. # 结果却是Jack