Silverspur
Silverspur

Reputation: 923

Code inside of class outside of methods vs code outside class

Here are two snippets of code:

Code 1:

# -*- coding: utf-8 -*-
class Foo:
    with open('myfile.json') as f:
        bar = json.loads(f)
    del f

    def __init__(self):
        print('Constructor')

# end of file

Code 2:

# -*- coding: utf-8 -*-
class Foo:
    def __init__(self):
        print('Constructor')

with open('myfile.json') as f:
    Foo.bar = json.loads(f)
del f

# end of file

Is there any difference between these two codes? If not, which one is to be preferred?

Upvotes: 1

Views: 991

Answers (2)

Jakub Sowa
Jakub Sowa

Reputation: 103

Both snippets achieve more or less the same thing, with the difference in cleanliness. In the first snippet, when reading this piece of code, you already know that the bar contains the contents of a file. In the second snippet, however, you don't know that the class has a variable bar until you see the end of a file.

Upvotes: 1

cadolphs
cadolphs

Reputation: 9647

Code 1: The outside-of-method code gets run once at the time of the definition of the class.

Code 2: The outside-of-method-and-class code gets run once during module import.

Since class definition happens at module import, the outcome should be exactly the same:

In either variation you end up with a class Foo whose class variable bar is set to the output of json.loads(f).

What's preferred? That's ultimately a matter of taste, isn't it? Code 1 emphasizes that this json and bar business belongs to the class. Code 2 emphasizes that our module does something special upon import. Sometimes that's an important point to make.

Upvotes: 3

Related Questions