有人可以给我解释python
中@classmethodand
的含义@staticmethod
吗?我需要知道区别和含义。
据我了解,@classmethod
告诉一个类它是一个应该继承到子类中的方法,或者……某种东西。但是,这有什么意义呢?为什么不直接定义不添加类方法@classmethod或@staticmethod
或任何@定义?
tl; dr: 我什么时候应该使用它们,为什么要使用它们,以及如何使用它们?
我对C ++
非常了解,因此使用更高级的编程概念应该不是问题。如果可能,请给我相应的C ++
示例。
尽管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),该参数保存对新创建实例的引用。
类方法
我们有一些任务可以使用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 date1
date2 = 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可以。
Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: def foo(x): print "executing foo(%s)"%(x) class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod
本文向大家介绍Python中staticmethod和classmethod的作用与区别,包括了Python中staticmethod和classmethod的作用与区别的使用技巧和注意事项,需要的朋友参考一下 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。 这有利于组织代
本文向大家介绍基于python中staticmethod和classmethod的区别(详解),包括了基于python中staticmethod和classmethod的区别(详解)的使用技巧和注意事项,需要的朋友参考一下 例子 上述类有三个函数,使用如下: 区别 • foo()的调用者必须是类A的一个实例,class_foo()与static_foo()的调用者既可以是类也可以是某个实例 • 参
rank ▲ ✰ vote url 14 805 326 554 url 装饰器@staticmethod和@classmethod有什么区别? 也许一些例子会有帮助:注意foo, class_foo 和static_foo参数的区别: class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,
问题内容: 它告诉我第1行和第5行(是调试/编程的新手,不确定是否有帮助) 为什么会给我这个错误? 问题答案: 你想给函数传递 对象 到你的功能,而不是结果 调用 来(这是因为不返回任何东西)。 所以试试这个: 也许这可以帮助您更好地理解:
这里是Uni learning Python编程入门课程的初学者。直到我明白了大部分,现在我很困惑。 有人能解释为什么这会产生它输出的模式吗? 外循环触发器和() 然后内部循环触发器和() 然后它不会打印(6),因为