我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
当前回答
是的,你是对的,这些是oop结构。
__init__是类的构造函数。self形参引用对象的实例(在c++中就像这样)。
class Point:
def __init__(self, x, y):
self._x = x
self._y = y
__init__方法在对象的内存被分配后被调用:
x = Point(1,2)
如果你想在对象中持久化这个值,在对象的方法中使用self参数是很重要的。例如,如果你像这样实现__init__方法:
class Point:
def __init__(self, x, y):
_x = x
_y = y
您的x和y参数将存储在堆栈上的变量中,当init方法超出作用域时将被丢弃。将这些变量设置为self。_x和self。_y将这些变量设置为Point对象的成员(在对象的生命周期内都可以访问)。
注意:对这个回答中“构造者”一词的使用做了一些澄清。从技术上讲,在Python中,“构造函数”的职责被划分为两个方法。这些方法是__new__(负责分配内存)和__init__(如本文所述,负责初始化新创建的实例)。
其他回答
__init__基本上是一个函数,它将为特定对象“初始化”/“激活”类的属性,一旦创建并匹配到相应的类。 Self表示将继承这些属性的对象。
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"
self做什么?这意味着什么?这是强制性的吗?
每个类方法(包括init)的第一个参数始终是对类当前实例的引用。按照惯例,这个参数总是命名为self。在init方法中,self指向新创建的对象;在其他类方法中,它引用被调用方法的实例。
Python不会强制你使用"self"。你可以给它起任何你想要的名字。但是记住方法定义中的第一个参数是对对象的引用。Python为你将self参数添加到列表中;在调用方法时不需要包含它。 如果你没有在init方法中提供self,那么你会得到一个错误
TypeError: __init___() takes no arguments (1 given)
init方法做什么?为什么有必要?(等)
Init是initialization的缩写。它是一个构造函数,当你创建类的实例时调用它,这是不必要的。但通常我们的做法是编写init方法来设置对象的默认状态。如果你不愿意在初始时设置对象的任何状态,那么你不需要编写这个方法。
在这段代码中:
class Cat:
def __init__(self, name):
self.name = name
def info(self):
print 'I am a cat and I am called', self.name
在这里,__init__充当类的构造函数,当对象实例化时,将调用此函数。Self表示实例化对象。
c = Cat('Kitty')
c.info()
上述陈述的结果如下:
I am a cat and I am called Kitty
Python __init__和self它们做什么? self做什么?这意味着什么?这是强制性的吗? __init__方法是做什么的?为什么有必要?(等)
给出的例子是不正确的,所以让我基于它创建一个正确的例子:
class SomeObject(object):
def __init__(self, blah):
self.blah = blah
def method(self):
return self.blah
当我们创建对象的实例时,会在对象创建后调用__init__来自定义对象。也就是说,当我们在下面用'blah'(可以是任何东西)调用SomeObject时,它会作为参数传递给__init__函数,blah:
an_object = SomeObject('blah')
self参数是SomeObject的实例,它将被赋值给an_object。
稍后,我们可能想在这个对象上调用一个方法:
an_object.method()
执行点查找,即an_object。方法,将实例绑定到函数的一个实例,并且该方法(如上所述)现在是一个“绑定”方法——这意味着我们不需要显式地将实例传递给方法调用。
方法调用获取实例,因为它绑定在点查找上,当调用时,执行它被编程执行的任何代码。
隐式传递的self参数按照约定称为self。我们可以使用任何其他合法的Python名称,但如果您将其更改为其他名称,则可能会受到其他Python程序员的批评。
__init__是一个特殊的方法,在Python数据模型文档中有说明。它在实例创建后立即被调用(通常通过__new__ -尽管__new__不是必需的,除非你要继承一个不可变的数据类型)。