正确理解实例方法、类方法、静态方法

帅比萌擦擦* 提交于 2020-01-25 08:38:06

实例方法

实例方法在我理解中,只能对对象调用,规定实例方法的函数中必须有self

 def movie(self):
        if self.__age>18:
            print('%s正在看岛国爱情片'%self.__name)
        else:
            print('小孩子还是看熊出没吧')

在定义对象之后,将消息都传给这个‘self’,也就是对象本身,所以说必须是对对象用,而不能对类使用

静态方法

在这里可以用一个例子来说明。
如果我们想计算一个三角形的面积和周长,但是给你的只有三个数,那么我们就需要首先判断这三个数能否构成三角形,因为这时候三角形都没构成,自然也就没构成三角形这一对象,所以判断函数应该使用静态方法,静态方法不需要self

from math import sqrt


class Triangle(object):

    def __init__(self, a, b, c):
        self._a = a
        self._b = b
        self._c = c

    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b

    def perimeter(self):
        return self._a + self._b + self._c

    def area(self):
        half = self.perimeter() / 2
        return sqrt(half * (half - self._a) *
                    (half - self._b) * (half - self._c))


def main():
    a, b, c = 3, 4, 5
    # 静态方法和类方法都是通过给类发消息来调用的
    if Triangle.is_valid(a, b, c):
        t = Triangle(a, b, c)
        print(t.perimeter())
        # 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
        # print(Triangle.perimeter(t))
        print(t.area())
        # print(Triangle.area(t))
    else:
        print('无法构成三角形.')


if __name__ == '__main__':
    main()

注意静态方法函数的上面需要@staticmethod

类方法

跟他的名字一样,类方法是直接对类的函数,其实类也可以称作对象,毕竟万物皆对象。类方法的函数与实例方法类似,函数的参数中必须有‘cls’。在主函数中直接调用类名来搞得函数。

from time import time, localtime, sleep


class Clock(object):
    """数字时钟"""

    def __init__(self, hour=0, minute=0, second=0):
        self._hour = hour
        self._minute = minute
        self._second = second

    @classmethod
    def now(cls):
        ctime = localtime(time())
        return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)

    def run(self):
        """走字"""
        self._second += 1
        if self._second == 60:
            self._second = 0
            self._minute += 1
            if self._minute == 60:
                self._minute = 0
                self._hour += 1
                if self._hour == 24:
                    self._hour = 0

    def show(self):
        """显示时间"""
        return '%02d:%02d:%02d' % \
               (self._hour, self._minute, self._second)


def main():
    # 通过类方法创建对象并获取系统时间
    clock = Clock.now()
    while True:
        print(clock.show())
        sleep(1)
        clock.run()


if __name__ == '__main__':
    main()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!