在类方法中访问__init__ vars

问题描述 投票:3回答:2

我来自java背景,所以在这里我有点困惑。

请考虑下面的代码段

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()时,当传递给同一类的任何其他obj_var时,可以通过__init__访问在a中创建的所有变量(classmethod)。显然不是这种情况。

问题

  • 当方法中提到装饰器__init__时,为什么我无法访问var中的class_method @classmethod,但是在移除装饰器时,它工作正常吗?

    ] >>
  • python在编译时如何在内部处理此特定类?

  • 有什么方法可以以相同的方法使用@classmethod__init__变量吗?

我来自Java背景,因此在这里我有些困惑。考虑类A()下的代码片段:def __init __(self,** kwargs):self.obj_var =“我是obj var” @classmethod ...

python decorator class-method python-decorators
2个回答
2
投票

让我们谈谈Python方法实际上是如何工作的。


0
投票

如果要从类方法访问实例变量,则需要创建存在该实例变量的类的实例。希望下面的代码可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.