zoukankan      html  css  js  c++  java
  • python静态方法、类方法和实例方法

    1. 静态方法

    如果我们的类属性是一个私有变量,我们就需要定义一个函数使得在类外可以访问它。我们希望既可以用类名来访问,也可以用实例名来访问,那么该如何做呢?

    下面这样是不行的:

    class Robot: 
        # __开头表示私有变量
        __counter = 0
        
        def __init__(self): 
            type(self).__counter += 1
            
        def RobotInstances(self):
            return Robot.__counter
        
    if __name__ == "__main__":
        x = Robot()
        print("通过实例访问: ", x.RobotInstances())
        # 下面会报错
        print("通过类访问: ", Robot.RobotInstances())

    改代码无法通过类名访问,因为这种定义方式必须要定义一个实例,self指向这个实例。

    如果我们在定义RobotInstances这个函数的时候,不写self参数,那么可以通过类访问,不能通过实例访问,静态方法就是为了解决这个问题。只需要在定义的函数前添加@staticmethod,这是装饰器语法。

    class Robot: 
        # __开头表示私有变量
        __counter = 0
        
        def __init__(self): 
            type(self).__counter += 1
       
        @staticmethod    
        def RobotInstances():
            return Robot.__counter
        
    if __name__ == "__main__":
        x = Robot()
        # 下面可以访问
        print("通过实例访问: ", x.RobotInstances())
        # 下面可以访问
        print("通过类访问: ", Robot.RobotInstances())

    2. 类方法与实例方法

    class Robot:
        __counter = 0
        
        def __init__(self):
            type(self).__counter += 1
            
        @classmethod
        def RobotInstances(cls):
            return cls, Robot.__counter
            
    
    if __name__ == "__main__":
        print(Robot.RobotInstances())
        x = Robot()
        print(x.RobotInstances())
        y = Robot()
        print(x.RobotInstances())
        print(Robot.RobotInstances())

    使用类方法不需要定义一个实例,类方法中的cls指向类,不像实例方法中的self指向一个实例。定义类方法,需要在函数前添加@classmethod装饰器。

    3. 类方法的应用案例

    类方法在继承当中很有用,在如下代码中,我们希望在不定义实例的情况下,可以查看_class_info信息,此时静态方法无法起到作用,因为它没有传入任何参数,无法识别是哪一个类。

    class Pet:
        _class_info = "pet animals"
    
        @classmethod
        def about(cls):
            print("This class is about " + cls._class_info + "!")   
        
    
    class Dog(Pet):
        _class_info = "man's best friends"
    
    class Cat(Pet):
        _class_info = "all kinds of cats"
    
    Pet.about()
    Dog.about()
    Cat.about()

     参考链接:

    [1] https://www.python-course.eu/python3_class_and_instance_attributes.php

  • 相关阅读:
    loadrunner11 录制手机App
    http协议调试代理工具介绍
    Loadrunner无法打开IE浏览器问题总结
    loadrunner的安装及问题总结
    Mac常用快捷键
    迭代器
    生成器
    python小程序
    python练习
    python集合
  • 原文地址:https://www.cnblogs.com/yunxiaofei/p/11210240.html
Copyright © 2011-2022 走看看