栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python-@classmethod和@staticmethod对初学者的意义?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python-@classmethod和@staticmethod对初学者的意义?

尽管

classmethod
staticmethod
非常相似,但是这两个实体的用法略有不同:
classmethod
必须将对类对象的引用作为第一个参数,而
staticmethod
根本不能包含任何参数。

class Date(object):    def __init__(self, day=0, month=0, year=0):        self.day = day        self.month = month        self.year = year    @classmethod    def from_string(cls, date_as_string):        day, month, year = map(int, date_as_string.split('-'))        date1 = cls(day, month, year)        return date1    @staticmethod    def is_date_valid(date_as_string):        day, month, year = map(int, date_as_string.split('-'))        return day <= 31 and month <= 12 and year <= 3999date2 = Date.from_string('11-09-2012')is_date = Date.is_date_valid('11-09-2012')

说明
让我们假设一个类的例子,处理日期信息(这将是我们的样板):

class Date(object):    def __init__(self, day=0, month=0, year=0):        self.day = day        self.month = month        self.year = year

此类显然可以用于存储有关某些日期的信息(没有时区信息;让我们假定所有日期都以UTC表示)。

在这里,我们有__init__一个Python类实例的典型初始化程序,它以典型形式接收参数instancemethod,并具有第一个非可选参数(self),该参数保存对新创建实例的引用。

类方法

我们有一些任务可以使用

classmethods
很好地完成。

假设我们要创建许多Date类实例,这些实例的日期信息来自外部源,编码为字符串,格式为

“ dd-mm-yyyy”
。假设我们必须在项目源代码的不同位置执行此操作。

因此,我们在这里必须做的是:

解析字符串以将日,月和年作为三个整数变量或由该变量组成的三项元组接收。
Date通过将这些值传递给初始化调用来实例化。
看起来像:

day, month, year = map(int, string_date.split('-'))date1 = Date(day, month, year)为此,C ++可以通过重载实现这种功能,但是Python缺少这种重载。相反,我们可以使用classmethod。让我们创建另一个“ 构造函数 ”。    @classmethod    def from_string(cls, date_as_string):        day, month, year = map(int, date_as_string.split('-'))        date1 = cls(day, month, year)        return date1date2 = Date.from_string('11-09-2012')

让我们更仔细地看一下上面的实现,并回顾一下我们在这里有哪些优点:

我们已经在一个地方实现了日期字符串解析,并且现在可以重用了。
封装在这里工作得很好(如果你认为可以在其他地方将字符串解析作为单个函数实现,则此解决方案更适合OOP范例)。
cls是保存类本身的对象,而不是类的实例。这很酷,因为如果我们继承我们的Date类,则所有子代也会

from_string
定义。
静态方法

staticmethod
呢 它非常类似于
classmethod
但不带任何强制性参数(就像类方法或实例方法一样)。

让我们看下一个用例。

我们有一个日期字符串,我们想以某种方式进行验证。从逻辑上讲,此任务也已绑定到Date我们到目前为止使用的类,但不需要实例化。

这是

staticmethod
有用的地方。让我们看下一段代码:

    @staticmethod    def is_date_valid(date_as_string):        day, month, year = map(int, date_as_string.split('-'))        return day <= 31 and month <= 12 and year <= 3999    # usage:    is_date = Date.is_date_valid('11-09-2012')

因此,从使用可以看到staticmethod,我们无权访问该类是什么—-它基本上只是一个函数,在语法上像方法一样被调用,但无法访问该对象及其内部(字段和另一个方法),而classmethod可以。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398501.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号