13.4. OOP Attribute Define¶
Attribute Annotation is optional, but a good practice
13.4.1. No Attribute Definition¶
>>> class User:
... pass
13.4.2. Basic Types¶
>>> class User:
... firstname: str
... lastname: str
... age: int
13.4.3. Union¶
>>> class User:
... firstname: str
... lastname: str
... age: int | float
13.4.4. Optional¶
>>> class User:
... firstname: str
... lastname: str
... age: int | float
... height: float | None
... weight: float | None
13.4.5. Sequences¶
Since Python 3.9 you can use
list[str]
Before Python 3.9 use
list
without specifying type of elements inside
>>> class User:
... firstname: str
... lastname: str
... age: int
... groups: list[str]
13.4.6. Relation One to One¶
>>> class Group:
... gid: int
... name: int
>>>
>>>
>>> class User:
... firstname: str
... lastname: str
... group: Group
13.4.7. Relation One to Many¶
>>> class Group:
... gid: int
... name: str
>>>
>>>
>>> class User:
... firstname: str
... lastname: str
... groups: list[Group]
13.4.8. Example¶
>>> class User:
... firstname: str
... lastname: str
... email: str
... active: bool
... age: int | float
... height: float | None
... weight: float | None
... groups: list[str] | None
... friends: list['User'] | None
13.4.9. Good Practices¶
snake_case
name conventionAttributes should be defined only in
__init__()
methodMore information in OOP Init Method
13.4.10. Use Case - 0x01¶
>>> class Point:
... x: int
... y: int
... z: int
13.4.11. Use Case - 0x02¶
>>> class Date:
... year: int
... month: int
... day: int
13.4.12. Use Case - 0x03¶
>>> class Laptop:
... cpu: str
... ram: str
... ssd: str
13.4.13. Use Case - 0x04¶
>>> class Iris:
... features: list[float]
... label: str
13.4.14. Use Case - 0x05¶
>>> class Iris:
... sepal_length: float
... sepal_width: float
... petal_length: float
... petal_width: float
... species: str
13.4.15. Use Case - 0x06¶
>>> from datetime import date
>>> from typing import Literal
>>>
>>>
>>> class Address:
... type: Literal['home', 'work']
... street: str
... house: str
... apartment: str
... post_code: str
... city: str
... region: str
... country: str
>>>
>>>
>>> class PhoneNumber:
... type: Literal['home', 'work', 'mobile']
... number: str
>>>
>>>
>>> class Person:
... firstname: str
... lastname: str
... age: int | float
... born: date
... gender: Literal['male', 'female']
... height: float | None
... weight: float | None
... education: list[str] | None
... job: str | None
... addresses: list[Address] | None
... emails: list[str] | None
... phones: PhoneNumber | None
... friends: list['Person'] | None
13.4.16. Assignments¶
"""
* Assignment: OOP Attribute Define
* Required: yes
* Complexity: easy
* Lines of code: 6 lines
* Time: 3 min
English:
1. Modify code below
2. Add type annotation attibutes to model the data:
a. Mark, USA, 1969-07-21
b. Nasa, USA, 1969-07-21
3. Run doctests - all must succeed
Polish:
1. Zmodyfikuj kod poniżej
2. Dodaj anotację typów atrybutów by zamodelować dane:
a. Mark, USA, 1969-07-21
b. Nasa, USA, 1969-07-21
3. Uruchom doctesty - wszystkie muszą się powieść
Tests:
>>> import sys; sys.tracebacklimit = 0
>>> assert len(Astronaut.__annotations__) == 3
>>> assert len(SpaceAgency.__annotations__) == 3
"""
# Mark, USA, 1969-07-21
# Nasa, USA, 1969-07-21
class Astronaut:
...
class SpaceAgency:
...