【发布时间】:2016-04-20 16:42:20
【问题描述】:
我来自java背景,所以在这里我有点困惑。
考虑下面的代码 sn-p:
class A():
def __init__(self, **kwargs):
self.obj_var = "I am obj var"
@classmethod
def class_method(cls):
print cls.obj_var # this line is in question here
cls.cls_obj = "I m class object"
return cls.cls_obj
这会引发错误:
In [30]: a = A()
In [31]: a.obj_var
Out[31]: 'I am obj var'
In [32]: a.class_method()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-32-3dcd9d512548> in <module>()
----> 1 a.class_method()
<ipython-input-29-9c0d341ad75f> in class_method(cls)
8 @classmethod
9 def class_method(cls):
---> 10 print cls.obj_var
11 cls.cls_obj = "I m class object"
12 return cls.cls_obj
AttributeError: class A has no attribute 'obj_var'
如果我注释掉@classmethod,这将正常工作。
我的理解(确实不正确):
当我执行a = A() 时,在__init__ 创建的所有变量(obj_var) 可以通过此a 访问,当传递给同一类的任何其他classmethod 时。显然情况并非如此.
问题
-
当方法中提到装饰器
@classmethod时,为什么我无法访问class_method中的__init__vars,但在移除装饰器时,它可以正常工作? -
python 在编译时如何在内部处理这个特定的类?
-
我有什么办法可以在同一方法中使用
@classmethod和__init__变量?
【问题讨论】:
-
如果你想要实例方法,为什么要使用
classmethod? -
@NoobEditor:这些或多或少是一样的,但同样,你没有以任何方式解释你为什么使用
classmethod。您似乎认为类方法只是您在类中定义的任何方法,但事实并非如此。您可能想查看this question 和this question。如果你想访问实例变量,不要使用classmethod。差不多就是这样。 -
Python 类方法类似于 Java 静态方法
-
@DavidHeffernan:不,他们不是。 Java 静态方法不参与多态性。它们不能覆盖或被其他方法(静态或其他方法)覆盖,并且不能在运行时在没有大量反射的情况下以多态方式调用。 Python 没有这些限制。
-
@Kevin 我说“类似于”,而不是“相同”。请记住,asker 是一个认为 classmethod 是实例方法的新手。就一个简单而有用的类比而言,我的评论是合理的。新手根本无法理解你刚才所说的话。虽然我知道你所说的一切,但你认为提问者能理解吗?想想学习过程。对于提问者来说,你的答案是完全错误的。
标签: python decorator python-decorators instance-variables class-method