Python 使用哪种:self还是super?
我正在将一个python类deque封装到队列中,以使代码更具可读性: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
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。这需要一本书来解释:。幸运的是,这里有一个非常棒的东西:。另外,看看这个问题。