Как передать объект класса для инициализации в Python - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть внешняя функция, которая создает класс из массива, и если я хочу инициализировать класс массивом, используя ту же функцию, я попробовал эквивалент следующего кода:

class Test():
    def __init__(self,x):
        if type(x) == int:
            self.val = x
            self.next = None
        elif type(x) == list:
            self = build(x)
    def __str__(self):
        node = self
        test_str = ''
        while(node):
            test_str += str(node.val)
            node = node.next
        return test_str

def build(array: list) -> Test:
    root = Test(array.pop(0))
    cur = root
    while array:
        cur.next = Test(array.pop(0))
        cur = cur.next
    return root

b = build([1,2,3])
print(b)

b = Test([1,2,3])
print(b)

Первая печать 123, что хорошо, вторая выдает ошибку, у объекта «Test» нет атрибута «val». Я посмотрел везде и не могу понять, как это сделать. Почему я не могу этого сделать, и как правильно добиться того, чего я хотел (кроме копирования и изменения функции сборки в init )?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я бы предпочел отдельный метод класса для одного из двух случаев, а не анализ типа аргумента. Это упрощает ваш код и упрощает код с использованием вашего кода.

class Test():
    def __init__(self, x: int, next: 'Test' = None):
        self.val = x
        self.next = next

    @classmethod
    def from_list(cls, lst: List[int]):
        if not lst:
            raise ValueError("Cannot create empty Test")

        root = Test(lst.pop(0))
        cur = root
        while array:
            cur.next = cls(lst.pop(0))
            cur = cur.next
        return root

    def __str__(self):
        node = self
        test_str = []
        while(node):
            test_str.append(str(node.val))
            node = node.next
        return ''.join(test_str)

Тогда

b = Test.from_list([1,2,3])
0 голосов
/ 29 апреля 2020

У него нет атрибута val, потому что вы инициализировали свой класс списком. Атрибут val создается только при передаче целого числа при инициализации.

...