2.9. UML Class Diagram¶
2.9.1. Attributes¶
>>> class Astronaut:
... firstname: str
... lastname: str
```mermaid
classDiagram
class Astronaut {
firstname: str
lastname: str
}
```

2.9.2. Methods Without Parameters¶
>>> class Astronaut:
... def say_hello(self):
... pass
```mermaid
classDiagram
class Astronaut {
say_hello()
}
```

2.9.3. Methods With Parameters¶
>>> class Astronaut:
... def say_hello(self, firstname: str, lastname: str):
... pass
```mermaid
classDiagram
class Astronaut {
say_hello(firstname: str, lastname: str)
}
```

2.9.4. Method Return Type¶
>>> class Astronaut:
... def say_hello(self) -> str:
... pass
```mermaid
classDiagram
class Astronaut {
say_hello() str
}
```

2.9.5. Abstract Methods¶
>>> from abc import ABC, abstractmethod
>>>
>>>
>>> class Astronaut(ABC):
... @abstractmethod
... def say_hello(self):
... pass
```mermaid
classDiagram
class Astronaut {
say_hello()*
}
```

2.9.6. Static Methods¶
>>> class Astronaut:
... @staticmethod
... def say_hello():
... pass
```mermaid
classDiagram
class Astronaut {
say_hello()$
}
```

2.9.7. Types¶
>>> class Astronaut:
... firstname: str
... lastname: str
...
... def say_hello(self, name: str) -> str:
... pass
```mermaid
classDiagram
class Astronaut {
firstname: str
lastname: str
say_hello(name: str) str
}
```

2.9.8. Access Modifiers¶
+
- Public-
- Private#
- Protected~
- Package/Internal
2.9.9. Access Modifiers - Public¶
>>> class Astronaut:
... firstname: str
... lastname: str
...
... def say_hello(self) -> str:
... pass
```mermaid
classDiagram
class Astronaut {
+firstname: str
+lastname: str
+say_hello() str
}
```

2.9.10. Access Modifiers - Protected¶
>>> class Astronaut:
... _firstname: str
... _lastname: str
...
... def _say_hello(self) -> str:
... pass
```mermaid
classDiagram
class Astronaut {
#firstname: str
#lastname: str
#say_hello() str
}
```

2.9.11. Access Modifiers - Private¶
>>> class Astronaut:
... __firstname: str
... __lastname: str
...
... def __say_hello(self) -> str:
... pass
```mermaid
classDiagram
class Astronaut {
-firstname: str
-lastname: str
-say_hello() str
}
```

2.9.12. Boxes and Arrows¶

2.9.13. Rationale¶









2.9.14. Django¶
GraphViz: https://graphviz.org/
Django Extensions: https://django-extensions.readthedocs.io/en/latest/graph_models.html#example-usage
$ brew install graphviz
$ pip install pydotplus
$ pip install django-extensions
# Add 'django_extensions' to INSTALLED_APP
$ python manage.py graph_models -a -g -o all.png
$ python manage.py graph_models myapp -g -o myapp.png
$ python manage.py graph_models -a -I Contact,Address -o models.png
$ python manage.py graph_models -a --arrow-shape normal -o myproject.png






2.9.15. Generate from code¶
sphinx.ext.graphviz
(fromsphinx
) - https://www.sphinx-doc.org/en/master/usage/extensions/graphviz.htmlpyreverse
(frompylint
) - https://www.logilab.org/blogentry/6883GraphModels
(fromdjango-command-extensions
) - https://django-extensions.readthedocs.io/en/latest/graph_models.html#example-usageepydoc
- http://epydoc.sourceforge.net - http://epydoc.sourceforge.net/api/epydoc.apidoc.VariableDoc-class.htmlpynsource
- http://pynsource.com/lumpy
- http://www.greenteapress.com/thinkpython/swampy/lumpy.htmlObjectDomain
- http://www.objectdomain.com/products/od-featuresargouml-python
- http://argouml-python.tigris.org/pywebuml
- https://bitbucket.org/tzulberti/pywebumluml-to-django
- https://github.com/auvipy/uml-to-djangoPython Vipera
- https://sourceforge.net/projects/pythonvipera/gaphor
- https://github.com/gaphor/gaphor
$ pyreverse -o png -p mymodule .