Python新手,试图准确理解self
函数中__init_(self)
所指的内容。
我正在使用的一些教程将self
描述为
引用其方法被调用的实例。
对于刚接触OOP的人来说,这并不是一个微不足道的声明。
我已经阅读了很多关于the whole backstory的内容,了解为什么你必须在Python中实际包含一个明确的self
,但是需要一个简单的解释来说明< strong> self
用于引用实例对象 - &gt;这是否意味着self
实际上指的是您刚刚创建的类本身的对象?换句话说,self
某种方式&#34;启动&#34;内存中的类作为对象?
答案 0 :(得分:3)
你的倒数第二句是正确的,但最后一句不是。它与“启动”或完全创建对象无关 - 该对象已经存在。
我认为您错过了__init__
在所有方法中使用的事实,而不仅仅是name
,以引用该方法所属的特定对象。
例如,如果您有一个具有print_name
属性的简单对象和一个名为def print_name(self):
print(self.name)
的方法,它可能如下所示:
self
所以这里的方法是使用{{1}}来引用它被调用的对象的属性。
答案 1 :(得分:2)
实例化对象时,对象本身会传递给self参数。
因此,对象的数据绑定到对象。下面是一个示例,说明如何可视化每个对象的数据外观。注意如何用对象名称替换“self”。我不是说下面的这个示例图是完全准确的,但它有望用于可视化自我的使用。
编辑(由于进一步的问题:你能解释为什么对象被实例化时,对象本身会被传递给自我参数吗?)
将Object传递给self参数,以便对象可以保留自己的数据。
虽然这可能不完全准确,但请考虑实例化这样的对象的过程:当创建对象时,它使用该类作为其自己的数据和方法的模板。如果不将自己的名称传递给self参数,则类中的属性和方法将保留为通用模板,并且不会引用(属于)对象。因此,通过将对象的名称传递给self参数,意味着如果从一个类中实例化了100个对象,则它们都可以跟踪自己的数据和方法。
见下图:
答案 2 :(得分:1)
为该类的某个实例(对象)调用类的每个成员函数,包括构造函数(__init__)。成员函数必须能够访问它们被调用的对象。
所以,例如在a.f()中,f()必须访问a。在f中,定义为f(this),这指的是a。 构造函数的特殊之处在于,“点之前”没有对象,因为正在构造该对象。因此,在这种情况下,这指的是“正在构建”的对象。
答案 3 :(得分:1)
当您编写__init__()
时,python首先创建您的类的实例,然后立即调用self
传递此对象作为参数。 __init__()
是您在调用$scope.clickButton = function(enteredValue) {
$scope.reset();
$scope.items = data;
angular.forEach($scope.items, function (item) {
if(item.fname === enteredValue || item.lname === enteredValue ){
$scope.results.push({
first: item.fname,
last: item.lname,
address: item.address,
phone: item.phone
});
时在内存中定义的对象。
答案 4 :(得分:1)
答案 5 :(得分:0)
简单来说,这意味着您指的是对象本地的方法或变量。
答案 6 :(得分:0)
你可以看看&#39; self&#39;作为referrer或指向类内部的指针,您可以使用它来调用方法或添加/删除/更新/删除属性。类在某种程度上是一个孤立的对象,它有自己的数据表示给它。所以基本上,self只是显式定义为一个参数,使用它可以访问类内部。某些编程语言没有明确包含关键字self。或者一些使用它(比如C ++)。看看这里:
a = 1
b = 2
class test(object):
def __init__(self,a,b):
self.a = a + 1
self.b = b + 1
def show_internals(self):
print self.a, '\t', self.b
def change_internals(self,a,b):
self.a = a
self.b = b
_my_class = test(3,4)
print a , b
_my_class.show_internals()
_my_class.change_internals(5,6)
_my_class.show_internals()
print a , b
结果是:
1 2
4 5
5 6
1 2
如您所见,使用self可以操纵对象本身的数据。否则你最终会编辑全局变量。