Python中的点符号。方法应该在对象之前还是之后?

时间:2017-01-28 23:14:29

标签: python methods notation

我正在学习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)

我们使用哪种方法?这有关系吗?

3 个答案:

答案 0 :(得分:1)

  

有时,对象位于括号内的方法之后:

Deck.__str__(self)

不,对象总是在它自己的方法之前。这一行有两个python“对象”。您将self对象(实际上是一个类实例)作为参数传递给__str__对象的Deck方法(实际上是一个类)。

答案 1 :(得分:1)

你使用Wenn:

 object.methodName()

然后用它自己的数据调用特殊实例的方法。 由于该方法与给定实例相关,因此会得到不同的结果。

a = Hand()
b = Hand()

然后

a.cards
b.cards

可能不同(大多数情况下)。

要访问此数据,对象self必须放入每个方法。 这可以通过以下方式完成:

def foo(self):
    return self.cards

定义方法时。

除非你不写一个特殊的类方法,否则你总是把自己放在那里。

当调用object.methodName()时,该方法会自动获取它所属对象的信息(因为你在点之前提交了对象/实例引用。这些信息存储在参数self中。该方法可以例如:return self.cards

但如果你把它称为Deck.__str__(self)而不是你只有这个类,这意味着没有self(这是对象引用本身)。

因此该方法不知道它属于哪个实例数据,因此您必须移交self

总结一下,如果你打电话: object.__str__()给出了有关实例的信息,因为您使用了对象引用来调用该方法。

但是如果你使用Deck resp。 className而不是必须通过className.method(self)放置有关实例的信息,因为否则没有对象实例的对象引用。

答案 2 :(得分:0)

通常,对象首先出现。

像这样:

object.methodName()

或者像这样:

self.isEmpty()

但是我想知道为什么我的Python书教会我称之为这样的方法:

Deck.__str__(self)

我想知道为什么“self”最后在括号中,而不是在方法的开头。换句话说,为什么不这样写:

self.Deck._str_()

原因是,上面的代码会引发错误:

"Hand instance has no attribute Deck

上面的错误是因为这样编写的,Python认为“Deck”是self的一个属性。但在这种情况下,它不是。 Deck,是Hand类型的PARENT类型,它不是self的属性。

下面是代码块,您可以在其中查看相关代码,以及父类型(Deck)和我正在使用的子类型(Hand)。在这段代码中,我们正在编写一个方法来覆盖Hand的字符串格式,方法是访问Deck中的字符串格式。代码段Deck.__str__(self) 是这样编写的,因为我们需要一种方法告诉Python我们希望它从哪个类型对象复制字符串格式。在这种情况下,我们希望从父版Deck中进行字符串格式化。

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)

另外,正如@ Martijn Pieters所述,使用SUPER:super().__str__()比按照我做的方式做得更好:Deck.__str__(self) 我们还没有学过Super,但你可以在这里了解更多信息(https://docs.python.org/2/library/functions.html#super)。 Super基本上告诉Python为你找到父格式,并使用它。更容易!

我希望这个解释是可以理解的。我试图过度解释以弥补任何不明确的事情: - /