Python Forum

Full Version: Preserve Encapsulation while Displaying Information
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
(Dec-07-2017, 04:26 PM)Windspar Wrote: [ -> ]@Mekire @snippsat
It might not be absolute private and name mangling. But docs say to use as such. section 9.6
So it is python way of support private class variables.

That being said, what is the Python way to create a variable and only allow a getter? Or tell the person using my code, this variable after object construction should be read-only.
If you really want to do that, just use an underscore.  That way it can still be used if they want, but you've gone out of their way to let them know they shouldn't be using it.
class Car:
    def __init__(self, model):
        self._model = model
    def model(self):
        return self._model
(Dec-07-2017, 04:31 PM)QueenSvetlana Wrote: [ -> ]
(Dec-07-2017, 04:26 PM)Windspar Wrote: [ -> ]@Mekire @snippsat
It might not be absolute private and name mangling. But docs say to use as such. section 9.6
So it is python way of support private class variables.

That being said, what is the Python way to create a variable and only allow a getter? Or tell the person using my code, this variable after object construction should be read-only.

Essentially you create a "getter" without the @property keyword. Suppose I want to keep it pure Python, so my class looks like this:

class Car:
    def __init__(self, ID, name, tire, engine):
        self.ID = ID
        self.name = name
        self.tire = tire
        self.engine = engine
How would I let client code know to use them as read only, if "getters" are not the Python way?
(Dec-07-2017, 04:48 PM)QueenSvetlana Wrote: [ -> ]How would I let client code know to use them as read only, if "getters" are not the Python way?
You can use @property in a way to get more towards read only,if you really need that.
Maybe not with all variables,let say ID should be more protected.
class Car:
    def __init__(self, ID, name, tire, engine):
        self._ID = ID
        self.name = name
        self.tire = tire
        self.engine = engine

    @property
    def ID(self):
        return self._ID

    def __str__(self):
        template = "ID: {ID} Name: {name} Tire: {tire} Engine: {engine}"
        return template.format(**vars(self))
Use:
>>> car_1 = Car(100, 'Opel', 'Goodyear', 1.9)
>>> car_1.name
'Opel'
>>> car_1.engine = 3.0
>>> car_1.engine
3.0
>>> car_1.ID = 900
Traceback (most recent call last):
  File "<string>", line 301, in runcode
  File "<interactive input>", line 1, in <module>
AttributeError: can't set attribute
Pages: 1 2