Best practice is to pick the one that meets your needs. If you need someone using your class to use the getter and setter - for example to perform checks, or to take care of required side-effects - then that's what you should do.
If it's just an attribute that you're happy to have changed by other code (no side-effects) the first solution is fine.
Note that there's also @property
decorators for a nicer way to do the second type - which would be best practice over these get_...
and set_...
methods:
class MyClassB():
def __init__(self):
self._my_attribute = 1
@property
def my_attribute(self):
return self._my_attribute
@my_attribute.setter
def my_attribute(self, value):
self._my_attribute = value
Note that adding the _
doesn't actually hide the attribute, it just generates warnings in editors that respect it:
b = MyClassB()
print(b.my_attribute)
b.my_attribute = 10
print(b.my_attribute)
print(b._my_attribute) # generates a warning, but works all the same
Output:
1
10
10