2016-08-24 1 views
0

Я пытаюсь вызвать конструктор объекта class в python. Мне удалось получить его на работу, используя следующие несколько строк:Вызов конструктора объекта cls в Python

obj = cls.__new__(cls) 
n = (List of attribute names) 
v = (List of attribute values) 

for s in n: 
    setattr(obj, s, v[s]) 

мне было интересно, если есть способ, чтобы непосредственно вставить значение атрибута + пар имени в конструктор, вызывают аргументы просто игнорируется, если я называю следующее:

obj = cls.__new__(cls, v) 

пс: Я использую python3

класс выглядит примерно так:

class InheritingClass(BaseClass): 
    def __init__(self, basic_attribute, another_attribute=None): 
     super().__init__(basic_attribute=basic_attribute) 
     self.another_attribute= another_attribute 

class BaseClass: 
    def __init__(self, basic_attribute=1): 
     self.basic_attribute= basic_attribute 

Так что ничего особенного там

+0

Что такое класс, который вы пытаетесь создать экземпляр? – Karin

+1

'cls (s, v)' вызывает ваш конструктор. '__new__' создает экземпляр,' __init__' инициализирует его; оба вызываются 'Foo (s, v)'. Если вы выполняете 'cls = Foo',' cls (s, v) 'делает то же самое. – Amadan

+0

@ Амадан спасибо, вот что я искал – Rittel

ответ

0

__init__ не является конструктором класса Python вместо __new__. Для получения дополнительной информации см. Pythons use of new and init.

0

Чтобы добавить, если вы хотите хранить произвольные атрибуты для вашего класса, вы можете использовать dict.update так:

class BaseClass: 
    def __init__(self, basic_attribute=1, **kw): 
     self.basic_attribute = basic_attribute 
     self.__dict__.update(**kw) 


class InheritingClass(BaseClass): 
    def __init__(self, basic_attribute, another_attribute=None, **kw): 
     super().__init__(basic_attribute=basic_attribute, **kw) 
     self.another_attribute = another_attribute 

Тогда:

ic = InheritingClass('hi', a=1, b=20) 
print(ic.a, ic.b) # prints 1, 20 
Смежные вопросы