How have access to both cls and self in a method

Question:

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?

Asked By: user2802557

||

Answers:

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.

Answered By: jasonharper

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.

Answered By: KarmaQueenn
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.