Style Q: Instance variables defined outside of __init__
On 3/19/2018 1:04 PM, Irv Kalb wrote:
> However, there is one warning that I am seeing often, an > I'm not sure about how to handle it. The warning I see is:
> "Instance attribute <instance variable name> defined outside of __init__ ..."
Style checkers are notorious for sometimes giving bad advice and being
I think a claim that in all programs all attributes should be set *in*
__init__, as opposed to *during* initialization, is wrong. All
attribute setting is side-effect from a functional view (and usually
'bad' to a functionalist). There is no reason to not delegate some of
it to sub-init functions when it makes sense to do do. There is good
reason to do so when it makes the code easier to understand *and test*.
Example: the IDLE's options setting dialog. Until last summer, it was
one class* with at perhaps a thousand lines of initialization code (with
no automated test). To me, the dictate that they should have all been
in the __init__ function is absurd. Fortunately, there were about 9
* We split off a class for each tab, but keep the separate functions to
create the tab page widgets and load them with current values.
> The following is a simple example. I am creating a card class that I am using to build card games with PyGame.
> class Card():
> BACK_OF_CARD_IMAGE = pygame.image.load('images/backOfCard.png')
> def __init__(self, window, name, suit, value):
> self.window = window
> self.suit = suit
> self.cardName = name + ' of ' + suit
> self.value = value
> fileName = 'images/' + self.cardName + '.png'
> self.image = pygame.image.load(fileName)
> self.backOfCardImage = Card.BACK_OF_CARD_IMAGE
> def conceal(self):
> self.faceUp = False
> def reveal(self):
> self.faceUp = True
If the single line is all these functions do, I *might* suggest getting
rid of them. But this is really a separate issue.
Terry Jan Reedy