资讯专栏INFORMATION COLUMN

Python 面向对象编程OOP (三) 类方法,静态方法

JerryZou / 2551人阅读

摘要:类的方法概览首先回顾一下常见的三种方法实例接口方法类方法静态方法标准书写方式如下我们最常用的其实就是普通的接口方法,其他两个需要用类似装饰器的写法来标注。类方法接受一个作为参数,它是指向本身的,并不是所创建的实例。

类的方法概览

首先回顾一下Python OOP常见的三种方法:

instance method 实例/接口方法

class method 类方法

static method 静态方法

标准书写方式如下:

class MyClass:
    def method(self):
        return "instance method called", self

    @classmethod
    def classmethod(cls):
        return "class method called", cls

    @staticmethod
    def staticmethod():
        return "static method called"

我们最常用的其实就是普通的接口方法,其他两个需要用类似装饰器的写法来标注。

类方法接受一个cls作为参数,它是指向MyClass本身的,并不是MyClass所创建的实例。

静态方法不接受self或者cls作为参数,所以不会修改类本身或者实例

类方法示例

看一下如何使用类方法,新建一个Pizza类,主要参数为原料ingredients

class Pizza:
    def __init__(self, ingredients):
        self.ingredients = ingredients

    def __repr__(self):
        return f"Pizza({self.ingredients !r})"

新建一个实例测试一下:

Pizza(["cheese", "tomatoes"])
Out: Pizza(["cheese", "tomatoes"])

测试成功。
现在问题来了,既然是Pizza类,会有不同口味的Pizza,他们的配方都是固定的,那么如何便捷的生成不同口味的Pizza呢,答案就是classmethod

class Pizza:
    def __init__(self, ingredients):
        self.ingredients = ingredients

    def __repr__(self):
        return f"Pizza({self.ingredients!r})"

    @classmethod
    def margherita(cls):
        return cls(["mozzarella", "tomatoes"])

    @classmethod
    def prosciutto(cls):
        return cls(["mozzarella", "tomatoes", "ham"])

类方法可以根据需求事先预定义生成的实例,减少了代码量,这里我们根据margherita和prosciutto两种口味pizza的原料提前准备好了,cls就是代表类本身,这样如果我们再生成一些实例时,会方便很多:

#生成一个margherita口味的pizza
m = Pizza.margherita()
m
Out:Pizza(["mozzarella", "tomatoes"])
#生成一个prosciutto口味的pizza
p = Pizza.prosciutto()
p
Out:Pizza(["mozzarella", "tomatoes", "ham"])
静态方法示例

那么什么时候用静态方法呢? 比如还用这个例子,我想计算pizza的面积:

import math

class Pizza:
    def __init__(self, radius, ingredients):
        self.radius = radius
        self.ingredients = ingredients

    def __repr__(self):
        return (f"Pizza({self.radius!r}, "
                f"{self.ingredients!r})")

    def area(self):
        return self.circle_area(self.radius)

    @staticmethod
    def circle_area(r):
        return r ** 2 * math.pi

这种情况下使用一个静态方法是一个好的选择,通过area这个普通的接口方法,可以调用circle_area来计算面积,封装性更好:

p = Pizza(4, ["mozzarella", "tomatoes"])
p.area() 

Out: 50.26548245743669
总结

这次简单总结了类中的三种方法,通过Pizza类的实例方便理解,如果大家有想和我沟通交流的,欢迎留言,或者点击以下链接访问我的网站:

我的Github 静态博客

谢谢阅读

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45182.html

相关文章

  • Python OOP 面向对象编程

    摘要:时代,如果需要手动继承,如多态多态是指,不同的子类对象调用相同的父类方法,会产生多态多样结果的编程特性。 参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的就是:推荐从小往大开始封装、开发类。比如手枪...

    weknow619 评论0 收藏0
  • 【数据科学系统学习】Python # 编程基础[]

    摘要:新的称为子类,而被继承的称为基类父类或超类。继承最大的好处是子类获得了父类的全部功能。在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。 在上一篇中我们介绍了模块和数据结构,这一篇将介绍面向对象编程。 面向对象编程 面向对象编程——Object Oriented Programming,简称 OOP,是一种程序设计思想。OOP 把对象作为程序的基本单元...

    molyzzx 评论0 收藏0
  • [零基础学python]关于的初步认识

    摘要:反对者在某些领域对此予以否认。下面再引用一段来自维基百科中关于的历史。类的更严格的定义是由某种特定的元数据所组成的内聚的包。类还可以有运行时表示形式元对象,它为操作与类相关的元数据提供了运行时支持。 在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。这些枯燥的属于解释,均来自维基百科。 1、问题...

    王岩威 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    李昌杰 评论0 收藏0

发表评论

0条评论

JerryZou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<