Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用哪种:self还是super?_Python_Oop - Fatal编程技术网

Python 使用哪种:self还是super?

Python 使用哪种:self还是super?,python,oop,Python,Oop,我正在将一个python类deque封装到队列中,以使代码更具可读性: from collections import deque class Queue(deque): def enqueue(self,a): super(Queue, self).append(a) def dequeue(self,a): super(Queue, self).popleft(a) 我的问题是我应该在这里使用哪一个,self.append还是superQ

我正在将一个python类deque封装到队列中,以使代码更具可读性:

from collections import deque

class Queue(deque):
    def enqueue(self,a):
        super(Queue, self).append(a)

    def dequeue(self,a):
        super(Queue, self).popleft(a)

我的问题是我应该在这里使用哪一个,self.append还是superQueue,self.append,为什么?

鉴于这两种选择,您应该使用self.append,因为您使用super的代码不是有效的Python


正确的替代版本应该是superQueue,self.append。

如果有这两种选择,您应该使用self.append,因为使用super的代码不是有效的Python

正确的替代版本应该是superQueue,self.append。

把你对super的使用不正确放在一边,就像Borealid所说的那样

但是,我认为在这种情况下,最好不要扩展deque,而是将其包装起来

from collections import deque

class Queue(object):
    def __init__(self):
        self.q = deque

    def enqueue(self, a):
        return self.q.append(a)

    def dequeue(self, a):
        return self.q.popleft(a)
另外,请注意返回值-在代码中,它们丢失了,并且您无法获得出列值。

请将您对super的使用不正确(如BorelID所述)放在一边

但是,我认为在这种情况下,最好不要扩展deque,而是将其包装起来

from collections import deque

class Queue(object):
    def __init__(self):
        self.q = deque

    def enqueue(self, a):
        return self.q.append(a)

    def dequeue(self, a):
        return self.q.popleft(a)

另外,请注意返回值-在代码中,它们丢失了,您无法获得出列值。

谁告诉过您,使用super而不是self是个好主意? 您希望影响队列的单个实例,而不是将附加到模块作用域中—更不用说super.append抛出AttributeError了


谁告诉你用super代替self是个好主意? 您希望影响队列的单个实例,而不是将附加到模块作用域中—更不用说super.append抛出AttributeError了

super用于调用在派生类中重新定义的基类方法。如果您的类正在定义扩展其行为的append和popleft方法,那么在append和popleft中使用super是合理的。但是,您的示例没有从deque中重新定义任何内容,因此不需要超级

以下示例显示了何时使用super:

然而,在多重继承的情况下,super所做的事情比只允许从基类调用方法更复杂。详细理解需要理解MRO方法解决顺序。因此,即使在上面的示例中,通常最好编写:

class Queue(deque):
    def append(self, a):
        # Now you explicitly call a method from base class
        # Otherwise you will make a recursive call
        deque.append(self, a)
        print "Append!!!"
super用于调用在派生类中重新定义的基类方法。如果您的类正在定义扩展其行为的append和popleft方法,那么在append和popleft中使用super是合理的。但是,您的示例没有从deque中重新定义任何内容,因此不需要超级

以下示例显示了何时使用super:

然而,在多重继承的情况下,super所做的事情比只允许从基类调用方法更复杂。详细理解需要理解MRO方法解决顺序。因此,即使在上面的示例中,通常最好编写:

class Queue(deque):
    def append(self, a):
        # Now you explicitly call a method from base class
        # Otherwise you will make a recursive call
        deque.append(self, a)
        print "Append!!!"


你为什么不试试呢?一个显然是正确的答案。超级指向父类,而self指向这个类。你无法比较那些关键字我尝试过使用它,但在这两种情况下都可以,所以我想知道它们之间是否有任何区别。只要你知道正确的语法,这两个选项都是可能的。你对super的使用毫无意义……请阅读super文档。这两个选项都是可能的。你在发帖前试过吗?为什么不试一下呢?一个显然是正确的答案。超级指向父类,而self指向这个类。你无法比较那些关键字我尝试过使用它,但在这两种情况下都可以,所以我想知道它们之间是否有任何区别。只要你知道正确的语法,这两个选项都是可能的。你对super的使用毫无意义……请阅读super文档。这两个选项都是可能的。发帖前你试过了吗?这两种方法有什么不同吗?这两种方法有什么不同吗?通常最好用合成我的例子,而不是继承你的例子。这要简单得多。另外,在你的例子中,细节是这样的:方法或deque会泄漏到你的类中,抽象也不会那么好。一般来说,组合比继承好吗?@dorafmon:大多数时候,是的。我可以问一下这是为什么吗?对不起,我是初学者,不太擅长OOP。这需要一本书来解释:。幸运的是,这里有一个非常棒的东西:。另外,看看这个问题。在我的例子中使用合成法通常比继承你们的例子要好。这要简单得多。另外,在你的例子中,细节是这样的:方法或deque会泄漏到你的类中,抽象也不会那么好。一般来说,组合比继承好吗?@dorafmon:大多数时候,是的。我可以问一下这是为什么吗?对不起,我是初学者,不太擅长OOP。这需要一本书来解释:。幸运的是,这里有一个非常棒的东西:。另外,看看这个问题。