создать класс без `class`

мне дали задание где нужно реализовать класс и некоторые методы, это я сделал, но там было условие что это надо сделать без class т.е. я не могу писать так

class MyClass:
   ...

помогите пожалуйста


Ответы (4 шт):

Автор решения: Vasyl Kolomiets

Вот пример

def double(x):
    return x*2

like_list = type("List", (list,), {"z":5, "double":double})
d = like_list("fdgfdgrtg")
print(d)

выдаст

['f', 'd', 'g', 'f', 'd', 'g', 'r', 't', 'g']

а d.z выдаст 5

проверьте что будет с

d.double()

Обращаю внимание, что первый аргумент функции передаваемой в словаре как будущий метод воспринимается как self, это если нужны более сложные операции. И да - __init__() не пробовал пока добавлять. Так что все переменные - классовые ))

→ Ссылка
Автор решения: Victor VosMottor

Занятный костыль. Можно воспользоваться функцией как объектом:

from types import MethodType

def f():
    return

f.param = 'val'

f.method = MethodType(lambda obj, x: print(obj.param + x), f)


# Теперь f не функция, a класс прикольно, да?
f.method('ue')

out:

value

Спасибо большое @mkkik за подсказку.

→ Ссылка
Автор решения: gil9red

Вариант с exec и eval:

def get_class(name: str) -> type:
    exec(f'''\
class {name}:
    def __init__(self, x):
        self.x = x

    def double(self):
        return self.x * 2
    ''')
    return eval(name)


MyClass = get_class('MyClass')
print(MyClass)
# <class '__main__.MyClass'>

x = MyClass(10)
print(x.double())
# 20
→ Ссылка
Автор решения: Vlad

получился такой код:

def __init__(self, x):
    self.x = x

def __str__(self):
    return str(self.x)

def double(self):
    self.x *= 2

MyClass = type("MyClass", (), {"__init__": __init__,
                               "__str__": __str__,
                               "double": double})

obj = MyClass(5)
print(obj)
obj.double()
print(obj)
→ Ссылка