Python内部类从外部继承

时间:2019-09-23 12:34:16

标签: python oop

我在类继承方面遇到问题,无法在其他地方找到合适的解决方案。

我有2个类,分别是Parent类和Child类。

ChildHuman的一种,因此我想使用类继承,通常我们只是简单地使用类继承。

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 个答案:

答案 0 :(得分:4)

遇到类定义时,直到读取整个正文并积累完整的字典后,才创建类对象。这与模块对象的创建方法相反,在模块对象中,空模块立即可用,以帮助避免循环导入等。话虽如此,没有什么可以阻止您在完全创建类之后修改其属性。

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. 虽然我是建议这种方法的人,但我不赞成这样做。不要将类复杂化,而不必将其保留在顶级名称空间中。