4、类的静态方法和类方法

几种方法的区别:
1、实例方法(普通方法)———————————随着实例属性的改变而改变
2、类方法(无论是类调用还是实例调用)————都是类属性的值,不随实例属性的变化而变化
3、静态方法—————————————————不可以访问类属性,故直接输出传入方法的值

一、回顾对象方法(实例方法)

如下类中定义的方法都是对象方法,对象方法第一个参数永远时self,表示创建的实例本身

#  如下类中定义的方法都是对象方法
class Student(object):

    # __init__是一个特殊方法用于在创建对象时进行初始化操作
    # 通过这个方法我们可以为学生对象绑定name和age两个属性
    # 注意到__init__方法的第一个参数永远是self,表示创建的实例本身
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def study(self, course_name):
        print('%s正在学习%s.' % (self.name, course_name))

    def watch_movie(self):
        if self.age < 18:
            print('%s只能观看熊出没' % self.name)
        else:
            print('%s正在观看灾难片' % self.name)


def main():
    # 创建学生对象并指定姓名和年龄
    stu1 = Student('小明', 2)
    stu1.age = 50
    stu1.study('python程序设计')
    stu1.watch_movie()


if __name__ == '__main__':
    main()

二、静态方法和类方法

静态方法:
实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题,代码如下所示。

特点:
静态方法第一个参数不是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 a+c > b and b+c > a

    def area(self):
        p = (self.a + self.b + self.c)/2
        s = sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
        return s


def main():
    a, b, c = 3, 4, 5
    if Triangle.is_valid(a, b, c):
        triangle = Triangle(a, b, c)
        print(triangle.area())
    else:
        print("不是三角形")


if __name__ == '__main__':
    main()

类方法:@classmethod,类直接调用

# 类方法@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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。