【问题标题】:Why don't functions take a `self` argument?为什么函数不接受 `self` 参数?
【发布时间】:2015-08-21 19:12:26
【问题描述】:

我对 Python 编程非常陌生,我只是有一个问题,为什么当我调用一个函数时它不起作用。我看到TypeError 关于die_roll 需要两个参数,但为什么添加到括号中时self.result 没有涵盖?

import random

def die_roll(self, result):
    self.result = random.randint(1, 10)
    print "Roll the dice, Dennis. "
    print "You have rolled a %s!" % self.result

print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("                  Welcome...                    ")
print ("   TO THE WORST GAME IN THE WORLD!!!!!!!!!!!    ")
print ("   REALLY, IT IS QUITE BAD. YOU'LL SEE......    ")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")

name = raw_input('Welcome to this awful adventure. Please enter your name to get started: \n')

print "\n%s? I don't like that name. \n" % (name)

name1 = raw_input('Try again: \n')

print "\n%s?! Really? That's the best you can do? You know what - just forget it. You will be called Dennis. \n" % (name1)

print "I happen to like Dennis. It's a good name. Regal. It's nice to meet you.... Dennis. \n"

print "You begin your adventure peering into a long, gloomy cave. You move by rolling a 10-sided dice.\n"

print "You will encounter random enemies along the way. If your combined rolls equal 100, you win!\n"

die_roll()

【问题讨论】:

  • 抱歉,格式有问题 - 这不是 PyCharm 中的样子,保证!
  • 您使用的是什么版本的 Python?我运行了代码,我必须修复很多(我仍然是)。
  • die_roll 需要两个参数,第一个被命名为 self。这强烈表明 die_roll 应该是一种方法,但它是一个独立的函数。顺便说一句,您没有将任何参数传递给对die_roll 的调用,也不会从中返回任何内容。
  • 你了解函数和方法的区别吗?
  • @ Jimmy360 - 我用 PyCharm 写了这个,它是为 2.7 设计的

标签: python function methods self


【解决方案1】:

您将您的功能定义为

def die_roll(self, result):

这告诉 python 解释器 die_roll 需要两个参数 self 和 result。

我猜你是从其他类中复制了这个方法,因为 self 是类中方法的第一个参数的正常命名约定,在后一种情况下,self(第一个参数)指的是“this”(来自 c++ 或 java)。

从函数体看,好像不需要任何参数,或许你可以试试-

def die_roll():
    result = random.randint(1, 10)
    print "Roll the dice, Dennis. "
    print "You have rolled a %s!" % result

【讨论】:

  • 就语义而言,类中的“函数”称为方法,而不是函数。
【解决方案2】:

嗯。我不确定您的主要误解在哪里,但您的问题中有几个。

您没有遵循程序的流程以及错误的来源:

def die_roll(self, result):
    /stuff here/

/stuff/

print "You will encounter random enemies along the way. If your combined rolls equal 100, you win!\n"

die_roll()  <---  here is where the TypeError about die_roll needing two arguments is triggered

为什么 self.result 添加到括号中时没有覆盖?,你问?因为错误是说您调用die_roll() 时的括号没有遵循您在创建def die_roll(...) 时设置的模式。您无法通过在定义函数的地方执行某些操作来避免该错误。他们总是需要在两个地方匹配——所有地方。如果def die_roll 说它需要两个参数,那么当你调用它时你需要给它两个参数。

另一个误解是您使用def die_roll(self, result) 然后self.result - 好像逗号和点运算符在某种程度上相关,或者您需要使用这些参数作为获取或返回结果的一种方式。 (他们不是,你不是)。

另一个是你使用self和result这两个词,就好像Python可以理解它们一样。它们不是关键字,在 Python 中没有特殊含义。

self 在 Python 中没有特殊含义,然而,它是人们为一个特定变量给出的标准名称……不幸的是,它与面向对象有关,其他的东西可能相当一个从零开始的滑溜溜的概念。

您的标题问题为什么函数不需要self 参数? 可以通过多种方式回答,但现在基本上都对您没有帮助。 blah blah 类定义对象,它们包含看起来与函数完全相同但称为方法的东西。方法需要一种方法来引用它们所在的对象,因此方法的第一个参数始终是它所在的对象,Python 引擎提供第一个参数,因此方法调用看起来总是不匹配,因为定义比调用多了一个参数。 self 是 Python 程序员为命名接收对象引用的变量而采用的约定,尽管它本身并不是一个特殊的名称。但这都是无关的背景,设置...

函数不需要self,因为它们不是“in”对象,因此它们不需要一种方法来引用它们“in”的对象,因为它们不在一个对象中。

是的,这不是很有帮助,抱歉。我能说的最有帮助的是,多写代码,多使用交互式解释器,多探索,事情就会变得清晰很多。

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2022-09-23
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2021-09-27
    • 2022-12-11
    相关资源
    最近更新 更多