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

    实例方法

    第一个参数是"self",表示实例对象,通过它传递实例的属性和方法。只能由实例调用

    类方法

    使用装饰器@classmethod,第一个参数可以是"cls",也可以是"self",通过它传递类的属性和方法。可以由类和实例调用

    假设我有一个学生类和一个班级类,想要实现的功能为:班级类含有类方法:执行班级人数增加的操作、获得班级的总人数,学生类继承自班级类,每实例化一个学生,班级人数都能增加。最后,我想定义一些学生,然后获得班级中的总人数
    这个问题用类方法做比较合适,因为我实例化的时学生,但是如果我从学生这一个实例中获得班级总人数是不合理的,同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的

    class ClassTest(object):
    
        __num = 0
    
        @classmethod
        def addNum(cls):
            cls.__num += 1
    
        @classmethod
        def getNum(cls):
            return cls.__num
    
        def __new__(self):
            ClassTest.addNum()
            return object.__new__(self)
    
    
    class Student(ClassTest):
        def __init__(self):
            self.name = ""
    
    a = Student()
    b = Student()
    print(ClassTest.getNum())
    

    静态方法

    使用装饰器 @staticmethod,不需要实例。静态方法主要用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有交互,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是独立的,单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。可以由类和实例调用
    例如,定义一个关于时间操作的类,其中有一个获得当前时间的函数

    import time
    
    class TimeTest(object):
    
        def __init__(self, hour, minute, second):
            self.hour = hour
            self.minute = minute
            self.second = second
    
        @staticmethod
        def showTime():
            return time.strftime("%H:%M:%S", time.localtime())
    
    
    print(TimeTest.showTime())
    t = TimeTest(2, 10, 10)
    nowTime = t.showTime()
    print(nowTime)
    

    使用静态函数,既可以将获得时间的函数功能与实例解绑,我想获得当前时间的字符串时,并不一定需要实例化对象,此时更像是一种名称空间。我们可以在类外面写一个简单的方法来做这些,但是这样做就扩散了类代码的关系到类定义的外面,这样写就会导致以后代码维护的困难

    参考文章

    《python中的静态方法和类方法》
    《python中类方法,实例方法,静态方法的作用和区别》

  • 相关阅读:
    Codeforces 877 C. Slava and tanks
    Codeforces 877 D. Olya and Energy Drinks
    2017 10.25 NOIP模拟赛
    2017 国庆湖南 Day1
    UVA 12113 Overlapping Squares
    学大伟业 国庆Day2
    51nod 1629 B君的圆锥
    51nod 1381 硬币游戏
    [JSOI2010]满汉全席
    学大伟业 2017 国庆 Day1
  • 原文地址:https://www.cnblogs.com/my_captain/p/12842933.html
Copyright © 2011-2022 走看看