Внутренний класс Python наследуется от внешнего - PullRequest
0 голосов
/ 23 сентября 2019

У меня проблема с наследованием классов, и я не смог найти подходящего решения в другом месте.

У меня есть 2 класса: класс Parent и класс Child.

A Child - это тип Human, поэтому я хочу использовать наследование классов, которое, как правило, было бы простым, просто у нас есть.

class Human:
    def __init__(self,type,name):     # Do this when we create a Node instance
        self.type = type
        self.name = name

class Child(Human):
    def __init__(self,name,siblings):     # Do this when we create a Node instance
        super().__init__(type=Child,name=name)
        self.siblings = siblings

, но я хочу быть больюи я хочу создавать экземпляры, используя Human.Child(parameters), а не Child(parameters), и я не хочу, чтобы в основной области видимости был класс Child.

Мне удалось заставить это работать с помощьюклассный метод но он довольно грязныйЕсть ли более элегантное решение?

class Human:
    def __init__(self,type,name):     # Do this when we create a Node instance
        self.type = type
        self.name = name

    def execute(self):
        print(f"executing the Human {self.name}")


    @classmethod
    def Child(cls,*args,**kwargs):

        class Child(cls):
            def __init__(self,name,siblings):
                super().__init__(type=Child,name=name)
                self.siblings = siblings

            def execute(self):
                print(f"executing the Child {self.name}")

        return(Child(*args,**kwargs))

в идеале это будет выглядеть примерно так, как показано ниже, но, конечно, мы не можем передать Human классу Child, так как он еще не определен.

class Human:
    def __init__(self,type,name):     # Do this when we create a Node instance
        self.type = type
        self.name = name

    def execute(self):
        print(f"executing the Human {self.name}")


    class Child(Human):
        def __init__(self,name,siblings):
            super().__init__(type=Child,name=name)
            self.siblings = siblings

        def execute(self):
            print(f"executing the Child {self.name}")

1 Ответ

4 голосов
/ 23 сентября 2019

Когда встречается определение класса, объект класса не создается, пока не будет прочитано все тело, и не будет накоплен полный словарь.Это противоположно тому, как создается объект модуля, когда пустой модуль доступен сразу же, чтобы, помимо прочего, избежать циклического импорта.При этом, ничто не мешает вам изменить атрибуты класса после того, как он полностью создан.

class Human:
    def __init__(self,type,name):     # Do this when we create a Node instance
        self.type = type
        self.name = name

class Child(Human):
    def __init__(self,name,siblings):     # Do this when we create a Node instance
        super().__init__(type=Child,name=name)
        self.siblings = siblings

Human.Child = Child
del Child

Несколько вещей, которые нужно иметь в виду:

  1. Передача в типеизлишний.Вы всегда можете получить доступ к этой информации через функцию type.
  2. Люди, как правило, имеют братьев и сестер даже после того, как перестают быть детьми.
  3. Хотя я и предлагаю такой подход, я неодобрить это.Вместо того, чтобы усложнять вещи без какой-либо необходимости, старайтесь держать ваши классы в пространстве имен верхнего уровня.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...