Динамически реализовать __str__, если не реализовано - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь написать функцию strFix, которая принимает объект класса в качестве параметра и проверяет, есть ли у класса метод str (), и, если нет, автоматически добавит один, который печатает все переменные-члены в одной строке, например: выводит число сторон, список сторон и площадь треугольника.

Однако после вызова strFix(triangle) я возвращаю объект треугольника вместо его печати?

def constructor(self, arg):
    self.no_of_sides = arg


def setSidesT(self, x, y, z):
    self.x = x
    self.y = y
    self.z = z
    self.listattr = [x, y, z]


def createSubClass(self):

    self = type(
        "Triangle",  # subclass name
        (Polygon,),  # super class(es)
        {
            "listattr": [],  # new attributes and functions/methods
            "setSides": setSidesT,
            "findArea": (lambda obj: (obj.x + obj.y + obj.z) / 2),
            "getTriangleSides": (lambda x: print(x.listattr)),
        },
    )
    return self


Polygon = type(
    "Polygon",
    (object,),
    {
        "no_of_sides": 0,
        "__init__": constructor,
        "getSides": (lambda obj: obj.no_of_sides),
    },
)


def Tprinter(self):
    return str(self.no_of_sides, self.getTriangleSides, self.findArea)


def strFix(self):
    if not type(self).__dict__.get("__str__"):
        setattr(self, "__str__", Tprinter)


triangle = createSubClass(Polygon)(3)
triangle.setSides(4, 5, 6)
triangle.getTriangleSides()
strFix(triangle)
print(triangle.findArea())
print(triangle)

1 Ответ

1 голос
/ 25 апреля 2020

Вы должны просто использовать classbody и обычный суперкласс со значением по умолчанию __str__ - это в то же время нормально, и делать то, что вы хотите.

Тем не менее, ваш strFix функция подключает метод __str__ к экземпляру , и это не сработает - вы должны установить __str__ для самого класса.

А также, нет необходимости использовать setattr когда достаточно =:

def strFix(instance):
    cls = instance.__class__
    if "__str__" not in cls.__dict__:
        cls.__str__ = Tprinter
...