zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    [CQOI2011]放棋子
    [CF1192B]动态直径
    [CERC2016]凸轮廓线
    19_08_14-19_08_21校内训练 补题
    [模板]线性递推+BM
    19_08_10[校内训练]割图
    [模板]多项式封装(无讲解)
    19_07_11校内训练[字串染色]
    CF990G
    19_07_09校内训练[分组]
  • 原文地址:https://www.cnblogs.com/kirusx/p/6973991.html
Copyright © 2011-2022 走看看