Получить все функции и атрибуты из уже созданного экземпляра родителя в дочернем классе - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь сделать this : Инициализировать дочерний класс с экземпляром родительского класса.

genomic_feature_instance инстанцируется и содержит следующее:

{'name': 'ENSG00000223972.5', 'type': 'gene', 'iv':, 'source': 'HAVANA', 'score': '.', 'frame': '.', 'attr': {'ID': 'ENSG00000223972.5', 'gene_id': 'ENSG00000223972.5', 'gene_type': 'transcribed_unprocessed_pseudogene', 'gene_status': 'KNOWN', 'gene_name': 'DDX11L1', 'leve l': '2', 'havana_gene': 'OTTHUMG00000000961.2'}}

Я хочу создать пользовательский / дочерний экземпляр для управления атрибутами и функциями из этого класса genomic_feature_instance.

 aCustomGenomicFeature = CustomGenomicFeature(genomic_feature_instance,'kikou')

Это то, что я сделал, но я хотел бы использовать super () для наследования всех значений атрибутов из этой genomic_feature (экземпляра GenomicFeature)

class CustomGenomicFeature(GenomicFeature):

    def __init__(self,genomic_feature_instance,kikou):

        # call parent constructor to set name and color 
        self.genomic_feature = genomic_feature_instance
        # Subclass-specific stuff follows
        self.kikou=kikou

1 Ответ

0 голосов
/ 18 января 2019

С __dict __. Update

Я бы посоветовал использовать __dict__ вместо super, потому что super не поможет вам скопировать значение атрибутов родительского объекта. Таким образом, вы могли бы сделать что-то вроде этого:

class A():
    def __init__(self):
        self.x = 1

class B(A):
    def __init__(self, a):
        super(B, self).__init__()
        self.__dict__.update(a.__dict__)

a = A()
b = B(a)

print(b.x)  # displays '1'

a.x = 3
b2 = B(a)

print(b2.x)  # displays '3'. Without the __dict__update, it would return '1'

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

В вашем случае:

class CustomGenomicFeature(GenomicFeature):

    def __init__(self,genomic_feature_instance,kikou):

        super().__init__()
        self.__dict__.update(genomic_feature_instance.__dict__)

        # Subclass-specific stuff follows
        self.kikou=kikou

С составом

Другим способом (и, возможно, более чистым) будет использование композиция вместо наследования:

class CustomGenomicFeature(GenomicFeature):

    def __init__(self,genomic_feature_instance,kikou):

        # keep ref to the genomic_feature_instance
        self._genomic_feature = genomic_feature_instance

        # Subclass-specific stuff follows
        self.kikou=kikou

    @property
    def name(self):
        return self._genomic_feature.name

Подробнее:

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