我正在学习Python编程语言,我遇到了一些我不完全理解的东西。

在如下方法中:

def method(self, blah):
    def __init__(?):
        ....
    ....

self做什么?这意味着什么?这是强制性的吗?

__init__方法是做什么的?为什么有必要?(等)

我认为它们可能是面向对象结构,但我知道的不多。


当前回答

self是类实例的引用

class foo:
    def bar(self):
            print "hi"

现在我们可以创建一个foo实例并调用它的方法,self参数在本例中由Python添加:

f = foo()
f.bar()

但是如果方法调用不在类实例的上下文中,它也可以被传入,下面的代码做同样的事情

f = foo()
foo.bar(f)

有趣的是,变量名“self”只是一种约定。下面的定义将工作完全相同..说了这么多,这是一种非常强烈的惯例,应该一直遵循,但它确实说明了语言的灵活性

class foo:
    def bar(s):
            print "hi"

其他回答

__init__确实像一个构造函数。如果您希望任何类函数表现为非静态方法,则需要将“self”作为第一个参数传递给它们。self是类的实例变量。

简而言之:

正如它所暗示的那样,Self指的是它自己——调用方法的对象。也就是说,如果你有N个对象调用这个方法,那么self。a将引用N个对象中每个对象的变量的一个单独实例。假设每个对象有N个变量a的副本 __init__在其他OOP语言(如c++ /Java)中被称为构造函数。基本思想是,它是一个特殊的方法,当创建该类的对象时自动调用

self做什么?这意味着什么?这是强制性的吗?

每个类方法(包括init)的第一个参数始终是对类当前实例的引用。按照惯例,这个参数总是命名为self。在init方法中,self指向新创建的对象;在其他类方法中,它引用被调用方法的实例。

Python不会强制你使用"self"。你可以给它起任何你想要的名字。但是记住方法定义中的第一个参数是对对象的引用。Python为你将self参数添加到列表中;在调用方法时不需要包含它。 如果你没有在init方法中提供self,那么你会得到一个错误

TypeError: __init___() takes no arguments (1 given)

init方法做什么?为什么有必要?(等)

Init是initialization的缩写。它是一个构造函数,当你创建类的实例时调用它,这是不必要的。但通常我们的做法是编写init方法来设置对象的默认状态。如果你不愿意在初始时设置对象的任何状态,那么你不需要编写这个方法。

注意,self实际上可以是任何有效的python标识符。例如,从Chris B的例子中,我们可以简单地写:

class A(object):
    def __init__(foo):
        foo.x = 'Hello'

    def method_a(bar, foo):
        print bar.x + ' ' + foo

结果是一样的。然而,建议使用self,因为其他python更容易识别它。

我自己也很难理解。即使在看完答案之后。

要正确理解__init__方法,你需要理解self。

self参数

__init__方法接受的参数是:

def __init__(self, arg1, arg2):

但实际上我们只传递了两个参数:

instance = OurClass('arg1', 'arg2')

额外的论证从何而来?

当我们通过名称(或引用)访问对象的属性时。这里的instance是对新对象的引用。我们使用instance.printargs访问实例对象的printargs方法。

为了从__init__方法中访问对象属性,我们需要一个对象引用。

每当调用方法时,对主对象的引用将作为第一个参数传递。按照惯例,你总是调用方法self的第一个参数。

这意味着在__init__方法中我们可以这样做:

self.arg1 = arg1
self.arg2 = arg2

这里我们在对象上设置属性。您可以通过以下方法验证这一点:

instance = OurClass('arg1', 'arg2')
print instance.arg1
arg1

这样的值称为对象属性。这里__init__方法设置实例的arg1和arg2属性。

来源:http://www.voidspace.org.uk/python/articles/OOP.shtml init方法