This question already has answers here:
Difference between staticmethod and classmethod
(31个答案)
2年前关闭。
有人可以向我解释python中
据我了解,
tl;博士:我什么时候应该使用它们,为什么要使用它们,以及如何使用它们?
解释
让我们假设一个类的例子,处理日期信息(这将是我们的样板):
此类显然可以用于存储有关某些日期的信息(没有时区信息;让我们假设所有日期都以UTC表示)。
在这里,我们有
类方法
我们有一些可以使用
假设我们要创建许多
因此,我们在这里必须做的是:
解析字符串以接收日,月和年作为三个整数变量或由该变量组成的3项元组。 通过将这些值传递给初始化调用来实例化
看起来像:
为此,C++可以通过重载实现这种功能,但是Python缺少这种重载。相反,我们可以使用
让我们更仔细地看一下上面的实现,并在这里回顾一下我们有哪些优点:
我们已经在一个地方实现了日期字符串解析,并且现在可以重用了。 封装在这里可以很好地工作(如果您认为可以在其他地方将字符串解析作为单个函数实现,则此解决方案更适合OOP范例)。
静态方法
那
让我们看下一个用例。
我们有一个日期字符串,我们想以某种方式进行验证。从逻辑上讲,此任务也已绑定(bind)到我们到目前为止使用的
这是
因此,正如我们从
(31个答案)
2年前关闭。
有人可以向我解释python中
@classmethod
和@staticmethod
的含义吗?我需要知道区别和含义。据我了解,
@classmethod
告诉一个类,它是一个应继承到子类中的方法,或者...。但是,这有什么意义呢?为什么不只定义类方法而不添加@classmethod
或@staticmethod
或任何@
定义呢?tl;博士:我什么时候应该使用它们,为什么要使用它们,以及如何使用它们?
最佳答案
尽管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 <= 3999
date2 = 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
),该参数持有对新创建的实例的引用。类方法
我们有一些可以使用
classmethod
很好地完成的任务。假设我们要创建许多
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 date1
date2 = Date.from_string('11-09-2012')
让我们更仔细地看一下上面的实现,并在这里回顾一下我们有哪些优点:
cls
是一个对象,它持有类本身,而不是该类的实例。这很酷,因为如果我们继承Date
类,则所有子代也会定义from_string
。 静态方法
那
staticmethod
呢?它与classmethod
非常相似,但不使用任何强制性参数(就像类方法或实例方法一样)。让我们看下一个用例。
我们有一个日期字符串,我们想以某种方式进行验证。从逻辑上讲,此任务也已绑定(bind)到我们到目前为止使用的
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确实可以。关于python - @classmethod和@staticmethod对初学者的意义? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12179271/
10-10 22:44