Как наследовать каждый класс в Python? - PullRequest
0 голосов
/ 09 мая 2018

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

class foo(object):
    def __init__(self,thing1,thing2,thing3,thing4,thing5,thingetc):
        self.1 = thing1
        self.2 = thing2
        self.3 = thing3
        self.4 = thing4
        self.5 = thing5
        self.etc = thingetc

class bar(foo):
    self.6 = []
a = bar
print a.3

очевидно, это не сработает, но вся документация, которую я могу найти в Интернете, сбивает с толку. Как вы наследуете переменные в таких случаях?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Используйте это как шаблон для вашего наследования, акцент на метод super () :

class Foo:
    def __init__(self):
        self.name = 'Foo'

class Bar(Foo):
    def __init__(self):
        super().__init__()

b = Bar()
b.name
# outputs 'Foo'

Для вашего конкретного типа класса (который принимает неизвестное количество аргументов инициализации, т. е. * args ):

class Foo:
    def __init__(self, *args):
        self.name = 'Foo'
        for i, arg in enumerate(args):
            setattr(self, 'thing_' + str(i), arg)

class Bar(Foo):
    def __init__(self, *args):
        super().__init__(*args)

b = Bar('hello', 'world')
b.name
# outputs 'Foo'
b.thing_0
# outputs 'hello'
b.thing_1
# outputs 'world'

Теперь я бы лично использовал **kwargs over *args для указания уникальных атрибутов экземпляра:

class Foo:
    def __init__(self, **kwargs):
        self.name = 'Foo'
        for att in kwargs:
            setattr(self, att, kwargs[att])

class Bar(Foo):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

b = Bar(value = 4, area = 3.14)
b.name
# outputs 'Foo'
b.value
# outputs 4
b.area
# outputs 3.14
0 голосов
/ 09 мая 2018

В настоящее время ваш код имеет недопустимый синтаксис, поскольку цифра не может быть в самом начале имени переменной. Однако вы можете использовать *args с __dict__:

class foo:
  def __init__(self, *args):
     self.__dict__ = dict(zip(['var{}'.format(i) for i in range(1, len(args)+1)], args))

f = foo(*range(15))
print(f.var1)
print(f.var14)

Выход:

0
13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...