'''
Любой класс относится к типу данных type и является его экземпляром.
'''
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greeting(self):
        return f'Hi, I am {self.name}. I am {self.age} years old'

def test_1():
    print(isinstance(Person, type))
    print(type(Person))

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class_body = """
def __init__(self, name, age):
    self.name = name
    self.age = age

def greeting(self):
    return f'Hi, I am {self.name}. I am {self.age} years old.'
"""

def test_2():
    class_namespace = {}

    exec(class_body, globals(), class_namespace)

    class_name = 'NewPerson'
    class_bases = tuple()
    NewPerson = type(class_name, class_bases, class_namespace)

    print(NewPerson)
    print(type(NewPerson))
    print(NewPerson.__dict__)



def main():
    # test_1()
    test_2()

if __name__ == '__main__':
    main()

