【发布时间】:2017-01-28 23:14:29
【问题描述】:
我正在学习 Python,并且正在尝试模拟纸牌游戏。 我有一个关于点符号的问题。我在整个互联网上寻找特定的答案,但找不到。
为什么,有时我们被教导要像这样以点表示法调用方法:
object.methodName()
而其他时候我们会这样称呼它:
className.methodName(object)
有什么区别?
这是一个具体的例子。这是书中的方法定义(如何像计算机科学家一样思考)
class Hand(Deck):
def __init__ (self, name = " "):
self.cards = []
self.name = name
def __str__(self):
s = "Hand "+ self.name
if self.isEmpty():
return s+" is empty\n"
else:
return s+ " contains\n" + Deck.__str__(self)
有时对象在方法之前:
self.isEmpty()
有时对象出现在方法之后,括号中:
Deck.__str__(self)
我们使用哪种方法?有关系吗?
【问题讨论】:
-
Deck是一个类,Deck.__str__是一个未绑定的方法。如果您尝试self.__str__()而不是再次调用Hand.__str__()方法(导致无限递归错误),您需要父类,因此它被显式调用。 -
但是,不推荐这样调用类。改用
super().__str__()(让super()弄清楚父类是什么以及如何正确找到Deck.__str__到self)。 -
您覆盖了
Hand子类中的__str__方法,因此需要调用__str__的父版本。如前所述,您应该改用super().__str__(),因为它处理更复杂的继承结构。 -
@Martijn Pieters @tdelaney 谢谢!我觉得我懂了。是的,“Deck”是“Hand”的父类。我们还没有被告知“super()”。我在 [link](docs.python.org) 上查找了它。是的,在您看到“Deck.__str__(self)”的地方,我们正在尝试访问父类“Deck”的字符串格式。所以现在我明白了为什么它是这样写的,我现在明白建议我们为此目的使用“super()”。在这种情况下使用 super() 的适当语法是:'super().__str__(self)' ?
-
@M.Copeland:不,是
super().__str__()。这会将您的下一个父类中的正确方法(按方法解析顺序)绑定到self,因此您无需手动传入self。添加评论时,有一个帮助链接,您可以检查格式信息;代码用`反引号标记。