13

I want to have code that does something like this

class myClass():

    def __init__(self):
        self.__var1 = 'var1'

    var2 = 'var2'

    def myNormalMethod(self):
        print self.__var1

    @classmethod
    def myClassMethod(cls):
       print cls.__var2

    #How do I do this?
    def myMethod():
        print self.__var1
        print cls.__var2

Right now the final method does not work as I do not know how I can have access to both self and cls. How do I implement this?

user2802557
  • 667
  • 6
  • 19
  • 2
    `myMethod()` should be declared as `myMethod(self)`, so it has access to `self` as a parameter. (Like `myNormalMethod(self)`, above.) You can get `self`'s class using `type(self)`. – khelwood Jan 24 '17 at 15:47

2 Answers2

13

As a very brief review, self refers to a current instance of the class while cls variables are attached to the class itelf i.e., shared among every instance. Here are some references to help with this, and how I got to your solution:

I modified your sample code to illustrate the difference and included a solution:

class MyClass:
    __var2 = 'var2'
    var3 = 'var3'

    def __init__(self):
        self.__var1 = 'var1'

    def normal_method(self):
        print self.__var1

    @classmethod
    def class_method(cls):
       print cls.__var2

    def my_method(self):
        print self.__var1
        print self.__var2
        print self.__class__.__var2


if __name__ == '__main__':
    print MyClass.__dict__['var3']

    clzz = MyClass()
    clzz.my_method()

__var2 and var3 are variables saved to the class. You can access any class variable without an instance via __dict__ which represents the name space.

Since class variables become a part of every instance, you can just call self to access them. Alternatively, you can explicitly call self.__class__.__var2 to make it clear where the intended variable is actually stored.

Community
  • 1
  • 1
KarmaQueenn
  • 171
  • 2
  • 4
8

You could just do self.__var2 - any attributes not found on the instance will be automatically looked up in the class.

To make it explicit that you're expecting the attribute to come from the class itself, use self.__class__.__var2.

jasonharper
  • 9,136
  • 2
  • 16
  • 38