我正在学习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)
我们使用哪种方法?这有关系吗?
答案 0 :(得分:1)
有时,对象位于括号内的方法之后:
Deck.__str__(self)
不,对象总是在它自己的方法之前。这一行有两个python“对象”。您将self
对象(实际上是一个类实例)作为参数传递给__str__
对象的Deck
方法(实际上是一个类)。
答案 1 :(得分:1)
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为你找到父格式,并使用它。更容易!
我希望这个解释是可以理解的。我试图过度解释以弥补任何不明确的事情: - /