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?
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
.
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.
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?
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
.
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.