| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 | import jsonclass PermissionnMixin:    def __init__(self):        self.permissions = set()    def grant_permission(self, permission):        self.permissions.add(permission)    def revoke_permission(self, permission):        self.permissions.discard(permission)    def has_permission(self, permission):        return permission in self.permissions    class User(PermissionnMixin):    def __init__(self, name, email):        super().__init__()        self.name = name        self.email = email# --------------------------------------------------class JsonSerializableMixin:    def to_json(self):        return json.dumps(self.__dict__)class Car(JsonSerializableMixin):    def __init__(self, make: str, color: str):        self.make = make        self.color = color# --------------------------------------------------class DictMixin:    def to_dict(self):        foo = json.dumps(self, default = lambda x:x.__dict__)        return json.loads(foo)class Phone(DictMixin):    def __init__(self, number):        self.number = numberclass Person(DictMixin):    def __init__(self, name, age, address):        self.name = name        self.age = age        self.address = addressclass Address(DictMixin):    def __init__(self, street, city, state, zip_code):        self.street = street        self.city = city        self.state = state        self.zip_code = zip_codeclass Company(DictMixin):    def __init__(self, name, address):        self.name = name        self.address = addressdef main():    # car = Car("Toyota", "red")    # print(car.__dict__)    # print(vars(car))    # # print(car.to_json())    # assert car.to_json() == '{"make": "Toyota", "color": "red"}'    address = Address("123 Main St", "Anytown", "CA", "12345")    john_doe = Person("John Doe", 30, address)    john_doe_dict = john_doe.to_dict()    print(john_doe_dict)    print(type(john_doe_dict))    assert john_doe_dict == {        'name': 'John Doe',        'age': 30,        'address': {            'street': '123 Main St',            'city': 'Anytown',            'state': 'CA',            'zip_code': '12345'        }    }    address = Address("123 Main St", "Albuquerque", "NM", "987654")    assert address.to_dict() == {        'street': '123 Main St',        'city': 'Albuquerque',        'state': 'NM',        'zip_code': '987654'    }    walter = Person("Walter White", 30, address)    assert walter.to_dict() == {'address': {'city': 'Albuquerque',                                            'state': 'NM',                                            'street': '123 Main St',                                            'zip_code': '987654'},                                'age': 30,                                'name': 'Walter White'}    walter_phone = Phone("555-1234")    walter.phone = walter_phone    assert walter.to_dict() == {'address': {'city': 'Albuquerque',                                            'state': 'NM',                                            'street': '123 Main St',                                            'zip_code': '987654'},                                'age': 30,                                'name': 'Walter White',                                'phone': {'number': '555-1234'}}    company_address = Address("3828 Piermont Dr", "Albuquerque", "NM", "12345")    company = Company("SCHOOL", company_address)    assert company.to_dict() == {'address': {'city': 'Albuquerque',                                            'state': 'NM',                                            'street': '3828 Piermont Dr',                                            'zip_code': '12345'},                                'name': 'SCHOOL'}    jesse_address = Address("456 Oak St", "Albuquerque", "NM", "12345")    jesse = Person("Jesse Bruce Pinkman", 27, jesse_address)    jesse.phone = Phone("555-5678")    fring = Person("Gustavo Fring", 55, Address("Los Pollos Hermanos", "Albuquerque", "NM", "12345"))    fring.friends = [walter, jesse]    assert fring.to_dict() == {'address': {'city': 'Albuquerque',                                        'state': 'NM',                                        'street': 'Los Pollos Hermanos',                                        'zip_code': '12345'},                            'age': 55,                            'friends': [{'address': {'city': 'Albuquerque',                                                        'state': 'NM',                                                        'street': '123 Main St',                                                        'zip_code': '987654'},                                            'age': 30,                                            'name': 'Walter White',                                            'phone': {'number': '555-1234'}},                                        {'address': {'city': 'Albuquerque',                                                        'state': 'NM',                                                        'street': '456 Oak St',                                                        'zip_code': '12345'},                                            'age': 27,                                            'name': 'Jesse Bruce Pinkman',                                            'phone': {'number': '555-5678'}}],                            'name': 'Gustavo Fring'}    print('Good')    '''    assert john_doe_dict == {        'name': 'John Doe',        'age': 30,        'address': {            'street': '123 Main St',            'city': 'Anytown',            'state': 'CA',            'zip_code': '12345'        }    }    '''    '''    user1 = User('Alice', 'alice@example.com')    user2 = User('Bob', 'bob@example.com')    assert user1.email == 'alice@example.com'    assert user1.name == 'Alice'    assert user1.permissions == set()    assert user2.email == 'bob@example.com'    assert user2.name == 'Bob'    assert user2.permissions == set()    user1.grant_permission('read')    user1.grant_permission('write')    user2.grant_permission('read')    assert user1.permissions == {'read', 'write'}    assert user2.permissions == {'read'}    assert user1.has_permission('read') is True    assert user1.has_permission('write') is True    assert user1.has_permission('execute') is False    assert user2.has_permission('read') is True    assert user2.has_permission('write') is False    assert user2.has_permission('execute') is False    user1.revoke_permission('write')    user1.revoke_permission('execute')    assert user1.has_permission('read') is True    assert user1.has_permission('write') is False    assert user1.has_permission('execute') is False    print('Good')    '''if __name__ == '__main__':    main()
 |