实例方法类方法和静态方法

Posted my_captain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实例方法类方法和静态方法相关的知识,希望对你有一定的参考价值。

实例方法

第一个参数是"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中类方法,实例方法,静态方法的作用和区别》




以上是关于实例方法类方法和静态方法的主要内容,如果未能解决你的问题,请参考以下文章

python 实例方法,类方法和静态方法

python中的实例方法静态方法和类方法

在java中,为啥类实例也能访问静态域?

面向对象的成员: 实例变量 类变量 实例方法 类方法 静态方法 属性 私有

Python中的实例方法类方法静态方法和普通方法

JAVA 静态方法不能访问直接