File: employee.py

package info (click to toggle)
python-atom 0.12.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,616 kB
  • sloc: cpp: 9,040; python: 6,249; makefile: 123
file content (84 lines) | stat: -rw-r--r-- 2,245 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# --------------------------------------------------------------------------------------
# Copyright (c) 2013-2025, Nucleic Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file LICENSE, distributed with this software.
# --------------------------------------------------------------------------------------
"""Simple example of a class hierarchy built on atom."""

import datetime

from atom.api import (
    Atom,
    Bool,
    ChangeDict,
    Int,
    Range,
    Str,
    Tuple,
    Typed,
    Value,
    observe,
)


class Person(Atom):
    """A simple class representing a person object."""

    last_name = Str()

    first_name = Str()

    age = Range(low=0)

    dob = Value(datetime.date(1970, 1, 1))

    debug = Bool(False)

    @observe("age")
    def debug_print(self, change: ChangeDict) -> None:
        """Prints out a debug message whenever the person's age changes."""
        if self.debug:
            templ = "{first} {last} is {age} years old."
            s = templ.format(first=self.first_name, last=self.last_name, age=self.age)
            print(s)


class Employer(Person):
    """An employer is a person who runs a company."""

    # The name of the company
    company_name = Str()


class Employee(Person):
    """An employee is person with a boss and a phone number."""

    # The employee's boss
    boss = Typed(Employer)

    # The employee's phone number as a tuple of 3 ints
    phone = Tuple(Int())

    # This method will be called automatically by atom when the
    # employee's phone number changes
    def _observe_phone(self, val: ChangeDict) -> None:
        if val["type"] == "update":
            msg = "received new phone number for %s: %s"
            print(msg % (self.first_name, val["value"]))


if __name__ == "__main__":
    # Create an employee with a boss
    boss_john = Employer(
        first_name="John", last_name="Paw", company_name="Packrat's Cats"
    )
    employee_mary = Employee(
        first_name="Mary", last_name="Sue", boss=boss_john, phone=(555, 555, 5555)
    )

    employee_mary.phone = (100, 100, 100)
    employee_mary.age = 40  # no debug message
    employee_mary.debug = True
    employee_mary.age = 50