16.6. OOP Attribute Get

16.6.1. Attribute Access

>>> class User:
...     firstname: str
...     lastname: str
>>>
>>>
>>> mark = User()
>>> mark.firstname = 'Mark'
>>> mark.lastname = 'Watney'
>>>
>>> print(f'Hello {mark.firstname} {mark.lastname}')
Hello Mark Watney

16.6.2. Accessing not Existing Attributes

>>> class User:
...     firstname: str
...     lastname: str
>>>
>>>
>>> mark = User()
>>> mark.firstname = 'Mark'
>>> mark.lastname = 'Watney'
>>>
>>> print(mark.groups)
Traceback (most recent call last):
AttributeError: 'User' object has no attribute 'groups'

16.6.3. Get All Attributes and Values

  • vars(obj) - returns all fields in dict format

Define a class

>>> class User:
...     firstname: str
...     lastname: str
...     email: str
...     agency: str

Set all attributes:

>>> watney = User()
>>> watney.firstname = 'Mark'
>>> watney.lastname = 'Watney'
>>> watney.email = 'mwatney@nasa.gov'

Getting dynamic fields and values:

>>> vars(watney)  
{'firstname': 'Mark',
 'lastname': 'Watney',
 'email': 'mwatney@nasa.gov'}

16.6.4. Select Attributes

>>> class User:
...     firstname: str
...     lastname: str
...     age: int
...     height: float
...     weight: float
>>>
>>>
>>> mark = User()
>>> mark.firstname = 'Mark'
>>> mark.lastname = 'Watney'
>>> mark.age = 42
>>> mark.height = 178.0
>>> mark.weight = 75.5
>>>
>>> vars(mark)
{'firstname': 'Mark', 'lastname': 'Watney', 'age': 42, 'height': 178.0, 'weight': 75.5}
>>>
>>> list(vars(mark).values())
['Mark', 'Watney', 42, 178.0, 75.5]
>>>
>>> [x for x in vars(mark).values() if type(x) is str]
['Mark', 'Watney']
>>>
>>> [x for x in vars(mark).values() if type(x) in (float, int)]
[42, 178.0, 75.5]
>>>
>>> {k:v for k,v in vars(mark).items()}
{'firstname': 'Mark', 'lastname': 'Watney', 'age': 42, 'height': 178.0, 'weight': 75.5}
>>>
>>> {k:v for k,v in vars(mark).items() if k in ['firstname', 'lastname']}
{'firstname': 'Mark', 'lastname': 'Watney'}
>>>
>>> {k:v for k,v in vars(mark).items() if type(v) is str}
{'firstname': 'Mark', 'lastname': 'Watney'}

16.6.5. Use Case - 0x01

>>> class Iris:
...     sepal_length: float
...     sepal_width: float
...     petal_length: float
...     petal_width: float
...     species: str
>>>
>>>
>>> flower = Iris()
>>> flower.sepal_length = 5.1
>>> flower.sepal_width = 3.5
>>> flower.petal_length = 1.4
>>> flower.petal_width = 0.2
>>> flower.species = 'setosa'
>>>
>>> vars(flower)  
{'sepal_length': 5.1,
 'sepal_width': 3.5,
 'petal_length': 1.4,
 'petal_width': 0.2,
 'species': 'setosa'}

16.6.6. Use Case - 0x02

>>> class User:
...     firstname: str
...     lastname: str
...     mission: str
...     agency: str
>>>
>>>
>>> mark = User()
>>> mark.firstname = 'Mark'
>>> mark.lastname = 'Watney'
>>> mark.email = 'mwatney@nasa.gov'
>>>
>>> melissa = User()
>>> melissa.firstname = 'Melissa'
>>> melissa.lastname = 'Lewis'
>>> melissa.email = 'mlewis@nasa.gov'
>>>
>>> vars(mark)
{'firstname': 'Mark', 'lastname': 'Watney', 'email': 'mwatney@nasa.gov'}
>>>
>>> vars(melissa)
{'firstname': 'Melissa', 'lastname': 'Lewis', 'email': 'mlewis@nasa.gov'}

16.6.7. Assignments

Code 16.7. Solution
"""
* Assignment: OOP Attribute Get
* Type: class assignment
* Complexity: easy
* Lines of code: 2 lines
* Time: 2 min

English:
    1. Define `result_mark: dict[str,str]`
       with all attributes and values of `mark` object
    2. Define `result_nasa: dict[str,str]`
       with all attributes and values of `nasa` object
    3. Use `vars()`
    4. Run doctests - all must succeed

Polish:
    1. Zdefiniuj `result_mark: dict[str,str]`
       z wszystkimi atrybutami i wartościami obiektu `mark`
    2. Zdefiniuj `result_nasa: dict[str,str]`
       z wszystkimi atrybutami i wartościami obiektu `nasa`
    3. Użyj `vars()`
    4. Uruchom doctesty - wszystkie muszą się powieść

Tests:
    >>> import sys; sys.tracebacklimit = 0

    >>> assert type(result_mark) is dict
    >>> assert type(result_nasa) is dict

    >>> result_mark
    {'name': 'Mark', 'country': 'USA', 'date': '1969-07-21'}

    >>> result_nasa
    {'name': 'Nasa', 'country': 'USA', 'date': '1969-07-21'}
"""


class Astronaut:
    name: str
    country: str
    date: str


class SpaceAgency:
    name: str
    country: str
    date: str


mark = Astronaut()
nasa = SpaceAgency()

mark.name = 'Mark'
mark.country = 'USA'
mark.date = '1969-07-21'

nasa.name = 'Nasa'
nasa.country = 'USA'
nasa.date = '1969-07-21'


# Dict with all attributes and values of `mark` object
# type: dict[str,str]
result_mark = ...

# Dict with all attributes and values of `nasa` object
# type: dict[str,str]
result_nasa = ...