Suppose I have the following directory structure:
Folder PATH listing
Volume serial number is 986C-80E1
C:.
test.py
__init__.py
No subfolders exist
__init__.py is blank. In test.py. I have the following code:
class Employee:
def __init__(self, identifier, name, address):
self.address = None
class Manager(Employee):
pass
class Secretary(Employee):
pass
class Address:
def __init__(self, street_num, street_name):
self.street_num = street_num
self.street_name = street_name
The idea here is to implement simple one-to-many composition. That is, all Employee subtypes also contain an Address instance.
I then run pyreverse -S -o uml.png . to generate a UML class diagram and get the following:
pyreverse doesn't recognize that there is a composite-component relationship between Employee and Address. However, if I refactor test.py to the following:
class Employee:
def __init__(self, identifier, name):
self.address = None
class Manager(Employee):
pass
class Secretary(Employee):
pass
class Address:
def __init__(self, street_num, street_name):
self.street_num = street_num
self.street_name = street_name
bob = Manager(1, "Bob")
bob.address = Address(1, "main ave")
I get that Address has an association with Manager.
Is this not technically incorrect? The association, as far as I understand, should be with the parent class Employee. Why does pyreverse consider that Address is only a component of Manager?


pyreversedetects that you have instantiatedManagerand this is why it considersAddressto be part ofManager. If you make a type hint in your constructor, thenpyreverseshould detect the correct relationship betweenEmployeeandAddress.