美文网首页
4、类的静态方法和类方法

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

作者: 1e026ca57a8e | 来源:发表于2020-05-15 16:36 被阅读0次

几种方法的区别:
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()

相关文章

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

    几种方法的区别:1、实例方法(普通方法)———————————随着实例属性的改变而改变2、类方法(无论是类调用还是...

  • python类的静态方法和类方法区别

    python类的静态方法和类方法区别 先看语法,python 类语法中有三种方法,实例方法,静态方法,类方法。 本...

  • ES6解读3:类class

    类的继承 类的getter和setter方法 静态方法以及静态属性 注意:静态方法只能是类调用,不能实例调用

  • 再论静态方法和类方法

    实例对象可以调用实例方法、类方法、静态方法 类对象只能调用类方法、静态方法

  • 2018-10-18类和对象总结

    1.类方法和静态方法 类中的方法: 对象方法, 类方法, 静态方法 对象方法:a、自带参数selfb、直接声明在类...

  • 为什么从静态的方法里调用非静态的方法或变量是非法的?

    结论: 非静态的方法可以调用静态的方法,但是静态的方法不可以调用非静态的方法。 类的静态成员(变量和方法)属于类本...

  • @classmethod和@staticmethod的区别

    简介 类的成员 python中类的成员可以分为三大类:字段、方法和属性 类的方法 包括:普通方法、静态方法和类方法...

  • Java基础知识的小总结(2)

    静态方法 静态方法其实就是类方法,与类有关的,普通的方法在类被实例化后,被对象来调用,静态方法无法调用非静态方法,...

  • php中静态类和非静态类

    静态类:类中含有static定义的静态属性或方法的类 静态类访问方法: 1、静态方法不需要实例化对象,可以通过类名...

  • 类和对象(二)

    一、类方法和静态方法 类中的方法分为:对象方法,类方法和静态方法 1.类方法a.在声明前添加@classmetho...

网友评论

      本文标题:4、类的静态方法和类方法

      本文链接:https://www.haomeiwen.com/subject/ldgcohtx.html