When I execute this code:
class cls : A=1 def __init__(self): self.a=2 obj=cls() print(hasattr(cls,'A')) print(hasattr(cls,'a')) print(hasattr(obj,'A')) print(hasattr(obj,'a'))
I get this output:
True False True True
Everything is clear to me except for the second line. Why do I get False
when I execute the hasattr
function on the class while I got True
when using it with the object for the same attribute?
Advertisement
Answer
Be careful cls
is typically used for classmethod
s for example like this:
class Person: def __init__(self, name, age): self.name = name self.age = age @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear)
So it is better to not use it for your own class names to avoid confusion.
Comming to your question.
In your first block you use a reference to the class itself. So here only static variables are visible as __init__
has not been called.
>>> print(hasattr(cls1,'A')) True >>> print(hasattr(cls1,'a')) False
In the second block you use an instance of the class. Here, __init__()
was executed and therefore obj.a
exists.
>>> obj=cls1() >>> print(hasattr(obj,'A')) True >>> print(hasattr(obj,'a')) True