【问题标题】:Super() doesn't works超级()不起作用
【发布时间】:2018-09-29 08:00:14
【问题描述】:

我的 Parent 类有一只猫和一只狗,我需要狗来执行 cat 类中的一个函数。

另外,cat 和 dog 需要是父类中的内部嵌套类。

我读到 dog 需要使用 super() 调用父类,然后使用他的 cat 实例。但它不起作用。

我得到了错误

TypeError: super(type, obj): obj must be an instance or subtype of type

_

Animal = Parent()
Animal.ThisDog.BarkToCat()

class Parent(object):   

    def __init__(self, *args, **kwargs):
        self.ThisCat = self.cat()
        self.ThisDog = self.dog()

    class cat(object):
        def barked(self):
            return ("I better run!")

    class dog(object):
        def BarkToCat(self):
            print(super(Parent,self).ThisCat.barked())

我不会写狗(父母)

class dog(Parent):
    def BarkToCat(self):
        print(super(Parent,self).ThisCat.barked())

...因为我得到了错误

NameError: name 'Parent' is not defined

我迷路了。这是如何在 Python 中完成的?

【问题讨论】:

  • 为什么你认为catdog需要嵌套类?看起来您误解了所有 3 个嵌套类、子类和 super
  • 我需要这里接受的答案stackoverflow.com/questions/719705/…
  • 明确 cat 只存在于 Parent 内部。它是在 Parent 中使用的东西
  • @user2357112 如果多年以后再读这段代码,我会立刻明白猫和狗与Parent有关。任何人都会很快理解它是如何工作的。它使代码可维护。
  • 您正在尝试编写 Python,就好像它是 Java 一样,好像内部类自动引用了外部类,并且好像 super(Parent, self) 是 Java 的 OuterClass.this。 Python 不是 Java,在 Java 中有意义的模式在 Python 中没有意义。

标签: python-3.x


【解决方案1】:

这是一个嵌套类的示例,并显式链接外部类和嵌套类的实例。没有魔法。

class Parent(object):

    def __init__(self, name):
        self.name = name
        self.dog = self.adopt_dog()

    def walk(self):
        print('%s walks, and %s goes %s' % (
            self.name, self.dog.name, self.dog.bark()))

    def adopt_dog(self):
        # Refer to an attrubute of the class Parent,
        # which happens to be another class, Dog.
        return self.__class__.Dog(self, '%s\'s dog' % self.name)

    # Now the namespaced class.

    class Dog(object):
        def __init__(self, master, name):
            self.master = master
            self.name = name

        def bark(self):
            return 'bark!'

试试看:

>>> joe = Parent('Joe')
>>> joe.walk()
Joe walks, and Joe's dog goes bark!
>>> joe.dog.master is joe
True
>>> _

【讨论】:

  • 它进行到一半,但是是乔和他的狗说话,而不是乔的狗和乔的猫说话。无论如何,我使用了类似的解决方案,并将其发布为答案
  • 当然你可以添加一只猫,这样猫就会在其方法中将狗称为self.master.dog。关键思想是master 链接。
【解决方案2】:

我找到了一种猫和狗相互交谈的方式,即在 dog 和 cat 中明确父级

class HasParent(object):
    def __init__(self, Parent=None):
        if (Parent is None):
            raise Exception("I need a parent!")
        self.Parent=Parent

class Parent(object):   

    def __init__(self):
        self.ThisCat = self.cat(Parent = self)
        self.ThisDog = self.dog(Parent = self)

    class cat(HasParent):

        def barked(self):
            return ("I better run!")

    class dog(HasParent):

        def BarkToCat(self):
            print(self.Parent.ThisCat.barked())


Animal = Parent()
Animal.ThisDog.BarkToCat()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多