class CustomType(type):
    def __new__(cls, name, bases, class_dict):
        print('Запуск создания нового типа данных!')
        # делегируем создание объекта через super 
        # в данном случае родитель - это класс type
        cls_obj = super().__new__(cls, name, bases, class_dict)
        cls_obj.say_hello = lambda self: f'Hello, my name is {self.name}'
        return cls_obj
    
class Person(metaclass=CustomType):
    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(Person)
    print('Type of Person is', type(Person))
    print('Person is isinstance of CustomType', isinstance(Person, CustomType))
    print('Person is isinstance of type', isinstance(Person, type))

    p = Person('Ivan', 25)
    print(p.greeting())
    print(p.say_hello())


def main():
    test_1()


if __name__ == '__main__':
    main()