0

0

对于初学者如何理解 @classmethod 和@staticmethod

anonymity

anonymity

发布时间:2019-05-27 11:09:31

|

3261人浏览过

|

来源于php中文网

原创

staticmethod相当于一个定义在类里面的函数,所以如果一个方法既不跟实例相关也不跟特定的类相关,推荐将其定义为一个staticmethod,这样不仅使代码一目了然,而且似的利于维护代码。

子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应的类的类变量。

对于初学者如何理解 @classmethod 和@staticmethod

理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。

举个例子,定义一个存储日期信息的类Date,这里重新定义了初始化函数。

class Date(object):
 
    day = 0
    month = 0
    year = 0
 
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year
    def tellDate(self):
        print 'Today is %s-%s-%s'%(self.day,self.month,self.year)

如果我们需要调用tell Date方法,我们就必须先创建一个实例,或者使用Date().tellDate()

date1 = Date()
date1.tellDate()

如何直接使用类名调用函数呢?

使用@classmethod或@staticmethod都可以类名.方法名()调用函数

现在假设我们需要创建很多Date的实例,日期信息以字符串的形式从外部传入,格式为'dd-mm-yyyy'。需要做的事

将日期信息字符串parse成一个含有年月日三个变量的元组;

实例化一个Date对象时就将年月日作为参数传入。

就像这样:

魔众社区购商城系统
魔众社区购商城系统

现在要说到社区团购模式,相信大家都不陌生,其实社区团购这种模式最初是从长沙开始,目前正向全国各地蔓延开来,这也使得一大批创业者正在如火如荼的想进入到社区团购这个行业中来,经过不断的学习,不断的讨论,慢慢的在心里形成了自己对于社区团购的理解。

下载
day, month, year = map(int, string_date.split('-'))
date1 = Date(day, month, year)

python不能像C++那样进行重载,所以我们引入class method ,它不需要self参数,但需要第一个参数是表示自身类的cls参数。

@classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

使用时可以直接类名.方法名()

这样编程的好处有:

分解字符串操作可以重复使用,而我们只需要传入参数一次;

OOP;

cos是类本身,而不是类的实例,当我们将Date作为父类时,其子类也会拥有from_string方法

和class method很相似的是staticmethod,但它不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

@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

所有程序及运行结果

class Date(object):
    day = 0
    month = 0
    year = 0
 
    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year
        
    def tellDate(self):
        print 'Today is %s-%s-%s'%(self.day,self.month,self.year)
    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date = cls(day, month, year)
        return date
 
    @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
 
if __name__ == '__main__':
    date1 = Date()
    date1.tellDate()
    date2 = Date.from_string("14-04-2016")
    date2.tellDate()
    print Date.is_date_valid("14-04-2016")

运行结果为:

Today is 0-0-0
Today is 14-4-2016
True

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

4

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号