首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无界法误差

无界法误差
EN

Stack Overflow用户
提问于 2017-03-17 16:21:23
回答 3查看 3.9K关注 0票数 0

我正在尝试理解python类中的self关键字。因此,我编了一个简单的课程:

代码语言:javascript
复制
class Question(object):
    """A class for answering my OO questions about python.

       attributes: a_number"""

    def __init__():
        print "You've initialized a Question!"

    def myself_add(self, new_number):
        self.a_number += new_number

在类定义下面的__main__函数中,我正在运行代码

代码语言:javascript
复制
my_q = Question
print my_q
my_q.a_number = 12
print 'A number:',my_q.a_number
my_q.myself_add(3)
print 'A number:',my_q.a_number

我得到的结果(包括错误)是

代码语言:javascript
复制
<class '__main__.Question'>
A number: 12
Traceback (most recent call last):
  File "question.py", line 21, in <module>
    my_q.myself_add(3)
TypeError: unbound method myself_add() must be called with Question instance as first argument (got int instance instead)

我试图理解为什么myself_add方法被认为是不绑定的。那是什么意思?为什么它不知道我是在Question类的一个实例上调用它呢?另外,为什么我的__init__打印不发生?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-17 16:33:11

为了创建一个实例,您需要编写Question()而不是Question

__init__应该至少采用自我论证

您还可能希望在self.a_number中初始化__init__或放入类主体中,否则如果不执行my_q.a_number = 12,则myself_add调用将失败。

票数 1
EN

Stack Overflow用户

发布于 2017-03-17 16:35:53

“自我”的论点可以是任何东西,但按惯例被称为“自我”。

默认情况下,它由python传递给您。

您可以尝试运行这个简单的代码片段来了解我的意思:

代码语言:javascript
复制
class A(object):
    def __init__(self):
        pass
    def check(self, checked):
        print self is checked

然后从命令行:

代码语言:javascript
复制
a=A()
a.check(a)

你可以这样做:

代码语言:javascript
复制
In [74]: b=A()

In [75]: a.check(b)
False

在这里,我创建了两个A的实例,一个叫做b,只有当把一个自我的实例和一个自身的实例进行比较时,才是正确的。

希望这是合理的。

特别是在您的情况下,您的类Question需要实例化(Question()),而您的__init__需要一个参数(自定义)。

当函数被绑定时,您可能会发现这个答案很有用:

What is the difference between a function, an unbound method and a bound method? (但可能是提前出价)

票数 1
EN

Stack Overflow用户

发布于 2017-03-17 16:42:44

首先,当初始化类的实例时,使用开始和结束括号,它按照约定调用__init__方法。

代码语言:javascript
复制
my_q = Question()

但是,在您的示例中,您的__init__方法没有绑定到使用self的对象,因此,如果您按原样运行它将导致错误,

代码语言:javascript
复制
    my_q = Question()
TypeError: __init__() takes no arguments (1 given)
>>> 

您需要使用__init__初始化self,以便实例能够对对象进行隐式调用。

代码语言:javascript
复制
def __init__(self):

现在,程序顺利运行,第一个打印就是my_q对象本身。

代码语言:javascript
复制
>>> 
You've initialized a Question!
<__main__.Question object at 0x028ED2F0>
A number: 12
A number: 15
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42862501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档