【问题标题】:Python Class in Class类中的 Python 类
【发布时间】:2021-02-13 08:19:41
【问题描述】:

有人可以帮我纠正这个错误吗?谢谢 (我正在尝试在子类中访问母类中的变量)

class Animal:
    
    def __init__(self, name):
        self.name = name
    
    class Mammal:
        
        def Presentation(self):
            print(self.name + "is a mammal")
            
dog = Animal("Dog")
dog.Mammal.Presentation()

Traceback(最近一次调用最后一次): 文件“”,第 11 行,在 TypeError:Presentation() 缺少 1 个必需的位置参数:'self1'

【问题讨论】:

  • “妈妈”和“女儿”类是什么意思?您声明了一个嵌套类,但您既没有实例也没有对可以使用的封闭类的任何直接引用
  • 为什么你认为Mammal 对象会有self.name 属性?它没有分配到任何地方?你认为将一个类定义嵌套在另一个类定义中会做什么?它创建继承关系。事实上,它并没有真正做任何有用的事情,除了可能保持命名空间分开
  • "我正在尝试访问子类中的母类中的变量" 但是您没有引用 Animal 类的任何实例,并且再次出现这里是没有母女关系。发生错误是因为您尝试在类对象上调用方法,而不是在实例上,但是没有self,因此出现错误。
  • 哺乳动物不是动物的属性;它是一种的动物。

标签: python class


【解决方案1】:

不是你问题的实际答案,但我猜你想做这样的事情:

class Animal:
    def __init__(self, name):
        self.name = name

    def Presentation(self):
        raise NotImplementedError


class Mammal(Animal):
    def Presentation(self):
        print(self.name + "is a mammal")


dog = Mammal("Dog")
dog.Presentation()

【讨论】:

  • 你不需要定义Mammal.__init__,因为它只是调用了表达式Mammal.__init__在没有定义的情况下解析到的相同方法。
  • 是的,没错,我的第一个未经编辑的答案不包含 init 函数。但我想展示如何调用它,以防更改参数“name”
  • @ExceptionFinder 覆盖 __init__ 在这里没有显示任何有用的信息。继承的全部是代码重用。
  • @ExceptionFinder 然后,至少,更改参数的名称,或者做一些保证覆盖该方法的事情。就像现在一样,它只是噪音。
  • @chepner 很好,我删除了它:) 虽然这不是我个人的偏好。
【解决方案2】:

子类必须继承父 self 属性才能做到这一点。

class Animal:
    def __init__(self, name):
        self.name = name
    class Mammal:
        def Presentation(inherit):
            print(inherit.name + “is a mammal”)
dog = Animal("Dog")
Animal.Mammal.Presentation(dog)

【讨论】:

  • 嗯,这是 a 解决方案,但它不是继承,这里没有父/子类。这只是为方法提供一个参数。并且错误地使用类
  • @AbrarAhmed 对,必须是 Animal.Mammal.Presentation(dog) 才不会引发错误,无论如何,这仍然不是正确的方法
  • 我非常有兴趣为我正在从事的项目看到正确的做法。
  • @JacobLee 正确的做法什么?使用继承?从根本上说,不需要嵌套类。这没有任何用处。您可以通过在类定义中使用类似class Child(Parent): ... 的dosthing 从另一个类继承。
  • 好的,所以这是不切实际的。
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2016-06-27
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多