is_<whatever_you_are_testing_for> as method or property?

Mateusz Loskot mateusz at loskot.net
Fri Dec 12 06:21:05 EST 2014


On 11 December 2014 at 19:20, Chris Angelico <rosuav at gmail.com> wrote:
> On Fri, Dec 12, 2014 at 4:34 AM, Mateusz Loskot <mateusz at loskot.net> wrote:
>> If a class member function simply tests something and
>> returns a b::oolean call it
>>
>> def is_<whatever_you_are_testing_for>():
>>  pass
>>
>> like 'is_even'.
>>
>> Should I define it as a classic method
>>
>> def is_even(self):
>>     pass
>>
>> or as a property
>>
>> @property
>> def is_even(self):
>>     pass
>
> A property should be used if what you're creating is "virtually an
> attribute". If it would make sense to have an attribute is_even, then
> a property is_even makes sense. If in doubt, go with a method.

Thanks for the advise.

I've got several cases which are not obvious to me.
For instance, class Foo has a boolean attribute, read-write,
which I see a couple of realisations for possible:

1) properties only
class Foo:
  @property
  def is_default(self):
    pass

  @is_default.setter
  def is_default(self, current):
    pass

2) property + method mix
class Foo:
  @property
  def is_default(self):
    pass

  def make_default(self, current):
    pass

3) methods only
class Foo:
  def is_default(self):
    pass

  def make_default(self, current):
    pass

>From one angle, that is is_default is known and does not need to be
calculated upon every query, the option 1) fits well.
It is aligned with Ethan's suggestion in the other post.

>From other point, let's assume updating it takes a little bit of changes of
state of Foo instance, then perhaps methods-only option 3) fits best.

Looks like "if in doubt, go with a method" is the safest bet.
'Statistics' from Python codebase also seem to suggest that.

Best regards,
-- 
Mateusz  Loskot, http://mateusz.loskot.net



More information about the Python-list mailing list