首页 > 代码库 > Python-面向对象高级语法之静态方法、类方法

Python-面向对象高级语法之静态方法、类方法

静态方法

一、什么是静态方法

  普通的方法可以在实例化后直接调用,并且在方法里可以通过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

Python-面向对象高级语法之静态方法、类方法