Python面向对象编程进阶3之静态方法和类方法

开始Python的复习!(以前学的忘了好多-_-)
主要参考的是Github上的一个项目:https://github.com/jackfrued/Python-100-Days
文章主要是对该项目中的内容进行学习 穿插一点自己的学习想法等内容~

静态方法

之前在类中定义的方法都是对象方法,这些方法都是发给对象的消息,是用来操作对象的。但这个类中也可以存在不操作类的方法。
例如,在输入边长计算三角形面积问题中,首先要判断这三条边能否组成三角形对象,能够组成才会进行后续的计算。
所以这个方法是属于三角形类但不属于三角形对象的。可以通过使用静态方法来解决这类问题。【加一个staticmethod装饰器即可】
这样的静态方法不需要创建类对象就可以被调用(通过类名直接调用即可)

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()

类方法

与静态方法类似的是,Python 中还可以在类中定义类方法,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象。
通过这个参数可以获取和类相关的信息并且可以创建出类的对象【调用classmethod装饰器】

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()
posted @ 2021-07-15 11:08  芋圆院长  阅读(61)  评论(0编辑  收藏  举报