Kim
Kim

Reputation: 13

Simple Question : about python class parenthesis

Look at the code below.

class A :
  def __init__(self, a = "Hello") :
    self.a = a

print(A().a) # 1

print(A.a) # 2

1 is not error

2 is error - AttributeError: type object 'A' has no attribute 'a'

What is the difference between the two results?

Upvotes: 1

Views: 65

Answers (2)

NickTsonis
NickTsonis

Reputation: 73

You need to create an instance of the class first:

class A :
    def __init__(self, a = "Hello") :
        self.a = a

class_instance = A()
print(class_instance.a)

You can set the value of "a" when creating the instance by typing in the parenthesis:

class_instance = A("this is the value of a")

you can change the value after the creation like so:

class_instance.a = "New value of a"

A().a is creating an instance and returns the a value of the instance. A.a cannot be executed because A is the Class name and doesn't have any attributes if you don't create an instance first

Upvotes: 0

Louis Lac
Louis Lac

Reputation: 6406

In your code A refers the the type of a class and also to its constructor/initialiser. A is called the class and when you construct an object of type A with the constructor you get an instance of that class.

A  # Refers to the class A
A()  # is an instance of class A

There is a difference between a class property and an instance property. Consider the following code:

class A:
  propertyA = "hello"

  def __init__(self, string="world"):
    self.propertyB = string

In this snippet propertyA is a class property while propertyB is an instance property. Each instance of type A has its own propertyB and you must instantiate and object (an instance) first.

A.propertyA  # Class property, does not need an instance
A().propertyB  # instance property, needs an instance

In your code the constructor for A is the code written in the __init__. This code will be called when you type A(). Note that you specified a default value for the parameter a but if you don't you would call the constructor like this:

A("hello")  # or:
A(a="hello")

Note that classes, instances and constructors are fundamentals of OOP (and by extension Python), you really should learn this, it avoids lots of basic errors.

Upvotes: 2

Related Questions