什么是类方法?

你好,
我熟悉静态方法概念,但是类方法是什么?
它与静态方法有何不同?什么时候使用?
- -
班级:
DEF方法(CLS,X):
经过
方法= ClassMethod(方法)
- -
感谢您的时间.

# 回答1


8月24日,6:32*PM,Hussein b 首先,不要使用方法= classMethod(方法).装饰师很远
更好的.以下代码具有相同的效果:
班级:
@ClassMethod
DEF方法(CLS,X):
经过
更可读性,对吧?
如果您发生了很多继承,则类方法很有用.
传递的第一个参数是呼叫该方法的类.便利
对于混合:它可以添加影响实际类的方法
进入,而不是弄乱混合本身.
# 回答2


hussein b 当您的方法需要知道从哪个类中调用什么类时,请使用它.
在子类的背景下,这是有道理的:
类M(对象):
@ClassMethod
DEF方法(CLS,X):
打印CLS,x
N级(M):
经过
<类'__ Main__.M'1
<类'__ -main __.n'1
# 回答3


8月24日,3:35*AM,Methegamemakingguy
写道:
首先,不要使用方法= classMethod(方法).装饰师很远
更好的.以下代码具有相同的效果:
班级:
*@classmethod
*DEF方法(CLS,X):
* 经过
更可读性,对吧?
如果您发生了很多继承,则类方法很有用.
传递的第一个参数是呼叫该方法的类.便利
对于混合:它可以添加影响实际类的方法
进入,而不是弄乱混合本身.
它类似于:
班级:#not正确如图所示
Def Newmaker(Self,X):
newinst = self .__类__(arg1,arg2,x)
返回newinst
m1 = m()
m2 = m1.newmaker('abc')
除了您不需要第一个实例.注意你
获取M1类的新实例,而不是
一定是M
N级(M):
经过
m1 = n()
m2 = m1.newmaker('abc')
M2现在也是N类.
# 回答4


LE 2008年8月24日星期日10:32:34 Hussein B,VousAvezécrit*:
正如已经说过的那样,它通过
提到称之为的真实类的平均值.
.....:@classmethod
.....:def工厂(cls, *args):返回cls( *args)
.....::
.....::
.....:def __init __(self,a,b):
.....:打印A,B
.....::
.....::
... [161]:<__ main __.一个在0x2B88D0E33710>的对象
1 2
... [162]:<__ main__.B对象在0x2B88D0E33BD0>
这是一个普遍的建议,即python不应该存在静态的方法
与模块级功能相比,没有什么,我们应该始终使用
分类代替它们.
- -
_____________
Maric Michaud
# 回答5


在2008年8月24日的阳光下,上午4:32,侯赛因B "类方法"与自那以来引入的元级概念有关
OOP的第一个开始,但到目前为止还不够.
如果你是capa 使用该概念来推理(建模),您
将需要Python中的" ClassMethod"装饰器.
"静态方法"是全球操作,但在
班级的名称空间上下文;因此,它们不是严格的方法.
在python中,一切都是一个对象,但是在
模块范围未接收模块的实例,因此它们不是
模块方法,它们不是方法,它们是全局功能
在这种情况下,是模块的名称空间上下文.
方法始终将实例作为特殊参数(通常
在python中宣布为自我).课程(从理论上讲)也是
对象(双重行为).
让我们明确:
#<代码>
类测试(对象):
def normalMethod(self):
打印"正常:",自我
@StaticMethod
def staticmethod(self = none):
打印"静态:",自我
@ClassMethod
DEF ClassMethod(self):
印刷"班级:",自我
test = test()
test.NormalMethod()
test.staticmethod()
test.classmethod()#实例" test"被强制为类
调用该方法.
#
问候
# 回答6


在阳光下,2008年8月24日11:09:46 +0200,hrvoje Niksic写道:
当您的方法需要知道从哪个类中调用什么类时,请使用它.

普通方法知道他们从什么类别来的类别,因为实例
知道他们属于什么课:
def方法(self, *args):
打印自我.__ class__
当您不需要或想知道什么实例时,您会使用类方法
它是从中调用的,但您确实需要知道它叫什么类
从:
@ClassMethod
def cmethod(cls, *args):
打印CLS
为什么这有用?考虑dict方法"来自keys".你可以称呼它
从任何字典中
只是从一个命令中称呼它:
{1:无,2:无,3:无}
{1:无,2:无,3:无}
任何行为诸如dict.fromkeys()的方法都是出色的候选人
对于ClassMethod.
- -
史蒂文

# 回答7


Steven d'Aprano 普通方法知道他们叫什么类
我想我应该添加"而不再". :-)
这也是ClassMethod和
staticmethod,因为从keys很聪明,可以使用该类型
信息.
.... 经过
...

如果" fromkeys"是静态的,那将必须是硬编码
始终创建命令.
# 回答8


Methegamemakingguy aécrit:
首先,不要使用方法= classMethod(方法).装饰师很远
更好的.以下代码具有相同的效果:
班级:
@ClassMethod
DEF方法(CLS,X):
经过
更可读性,对吧?
是的,但只能与python一起使用> = 2.4.在某些情况下
想要与Python 2.3保持兼容性...
我不确定我在这里明白了.
就我而言,ClassMethods在您需要的任何地方都有用
在类对象本身上工作.
# 回答9


Maric Michaud Aécrit:
(剪)
他们"无所作为",但可以通过班级访问 CT而不是CT
通过模块对象访问.有时碰巧是
有用(就我而言,"有时"非常低的价值
关心,但仍然...)
# 回答10


2008年8月26日星期二,下午4:10,布鲁诺·德索利尔
在OOP中,元级的概念与课堂有关
方法,无论是在Python,Smalltalk还是Closs中. " classmethod"
装饰器只是定义它们的语法结构.有
在"方法1"和" method2"上(概念上)没有区别:
<样本>
类MetaxClass(类型):
def方法1(self):通过
XCLASS类(对象):
__ metaclass__ = metaxClass
@ClassMethod
def方法2(self):通过

对,他们是.在模块级别定义的功能或使用staticmethod
装饰者不接受例子作为参数,他们是Globa,
您可以在Python学习:
*全局关键字
*全球功能
认真地说,我是程序员,而不是中级代码工程师.我知道
很好的python在其内部工作方式,但是这个论坛是谈论
关于Python编程.
然而,在某种程度上,总是称为原始定义
函数,是的,它将自我作为一个参数.
为什么不?
真的
那只是意味着Python很好
最佳OOP理论.
不适合我.我曾经在Pythonic方面保持一致,但是有
一些例外.
我只是想要一个提出问题的人,看不到其他
差异,但分类装饰器.
对不起! http://docs.python.org/ref/coercion-rules.html
我从来没有假装这样做.我喜欢的编程是高水平,
由于那个python现在是我首选的语言,
尽管如此,我知道我对Inner Python感兴趣的每一件事.
我最诚挚的问候
# 回答11


8月24日,5:32*上午,侯赛因B 当我需要班级的替代构造函数时,我会使用它们.
类角度(对象):
def __init __(自我,学位):
self.degrees =度
@ClassMethod
def from_radians(CLS,弧度):
返回CLS(弧度 / pi * 180.0)
这使我可以用角度(45)或
Angle.from_radians(pi/4).
该示例显示了有关ClassMethods的特殊之处.首先
参数是一类,而不是实例.
雷蒙德
# 回答12


Medardo Rodriguez(Merchise Group)写道:
在OOP中,元级的概念与课堂有关
方法,无论是在Python,Smalltalk还是Closs中. " classmethod"
装饰器只是定义它们的语法结构.有
在"方法1"和" method2"上(概念上)没有区别:
<样本>
类MetaxClass(类型):
def方法1(self):通过
XCLASS类(对象):
__ metaclass__ = metaxClass
@ClassMethod
def方法2(self):通过

不完全的:
.... def方法1(self):通过
...
.... __ metaclass__ = metaxClass
.... @classmethod
.... def方法2(self):通过
...
Trackback(最近的最新电话):
文件" ",第1行,<模块>
attributeError:'xc lass"对象没有属性'method1'
>
-MATT
# 回答13


Medardo Rodriguez(Merchise Group)Aécrit:
在OOP中,元级的概念与课堂有关
方法,无论是在Python,Smalltalk还是Closs中.
好的,我想我们不会在这里达成共识,因为您认为理所当然
有一个通用,独立于语言的事情
OOP概念的定义,我没有(除了两个非常基本的
概念:1/一个对象由身份,状态和一个对象定义
行为,2/对象通过向彼此发送消息来交互).
有两个明显的区别:方法1是类的实例方法
MetaxClass,只能在MetaxClass的实例上调用
方法2是类XClass的类方法,可以在任何一个上调用
XCLASS或XCLASS实例.
对,他们是.在模块级别定义的功能或使用staticmethod
装饰者不会收到实例作为参数,
嵌套函数不会接收""实例作为参数
即使是从Python特异性的POV中,静态方法也不是.
我认为我不需要研究它们,谢谢.
但是我必须承认,因为我根据"通用"不同意您的意见
CS概念与Python特定概念"我不应该提及这一点
- 从python特定的POV中,定义在a的顶级的函数
模块确实是"全球"(就像模块上绑定的任何名称一样
等级). otho,您现在也依靠特定于Python的定义
这里的"全球".
认真地说,我是程序员,而不是中级代码工程师.我知道
很好的python在其内部工作方式,但是这个论坛是谈论
关于Python编程.
的确.
抱歉,我不明白上述句子(严重 - 没有挑剔
这里).
为什么不?
嗯....因为在python中,类 *是 *对象,而不仅仅是来自
理论POV? - )
真的

那只是意味着Python很好
最佳OOP理论.
哪一个 ? Java的OOP理论? Smalltalk的OOP理论?关闭OOP
理论? JavaScript的OOP理论? IO的OOP理论?埃菲尔的OOP理论?
就我而言,它们的" oop理论"和它们一样多
" OOP语言".
不适合我.我曾经在Pythonic方面保持一致,但是有
一些例外.

来自Windows世界?

我只是想要一个提出问题的人,看不到其他
差异,但分类装饰器.
对不起! http://docs.python.org/ref/coercion-rules.html
好的,你让我参加了这个.我的意思是什么都没有
喜欢打字. *和*课程传递给ClassMethods的方式
无论如何,呼叫一个实例与胁迫无关(至少
对于"胁迫"的普遍接受定义).
我从来没有假装这样做.
对不起,无论如何这段段落.我经常往往变得太苛刻,并且
后来后悔.真挚地.
最好的问候,感谢您没有像我那样脾气暴躁 结束.

标签: python

添加新评论