在定义类时,在__init __(self)函数中理解实例对象引用自约定

时间:2015-06-25 17:16:21

标签: python class object instance

Python新手,试图准确理解self函数中__init_(self)所指的内容。

我正在使用的一些教程将self描述为

  

引用其方法被调用的实例。

对于刚接触OOP的人来说,这并不是一个微不足道的声明。

我已经阅读了很多关于the whole backstory的内容,了解为什么你必须在Python中实际包含一个明确的self,但是需要一个简单的解释来说明< strong> self用于引用实例对象 - &gt;这是否意味着self实际上指的是您刚刚创建的类本身的对象?换句话说,self某种方式&#34;启动&#34;内存中的类作为对象?

7 个答案:

答案 0 :(得分:3)

你的倒数第二句是正确的,但最后一句不是。它与“启动”或完全创建对象无关 - 该对象已经存在。

我认为您错过了__init__在所有方法中使用的事实,而不仅仅是name,以引用该方法所属的特定对象。

例如,如果您有一个具有print_name属性的简单对象和一个名为def print_name(self): print(self.name) 的方法,它可能如下所示:

self

所以这里的方法是使用{{1}}来引用它被调用的对象的属性。

答案 1 :(得分:2)

实例化对象时,对象本身会传递给self参数。

enter image description here

因此,对象的数据绑定到对象。下面是一个示例,说明如何可视化每个对象的数据外观。注意如何用对象名称替换“self”。我不是说下面的这个示例图是完全准确的,但它有望用于可视化自我的使用。

enter image description here

编辑(由于进一步的问题:你能解释为什么对象被实例化时,对象本身会被传递给自我参数吗?

将Object传递给self参数,以便对象可以保留自己的数据。

虽然这可能不完全准确,但请考虑实例化这样的对象的过程:当创建对象时,它使用该类作为其自己的数据和方法的模板。如果不将自己的名称传递给self参数,则类中的属性和方法将保留为通用模板,并且不会引用(属于)对象。因此,通过将对象的名称传递给self参数,意味着如果从一个类中实例化了100个对象,则它们都可以跟踪自己的数据和方法。

见下图:

enter image description here

答案 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)

Behind the scenes, object construction is actually quite complicated. Classes are objects too, and the type of a class is type (or a subclass, if using metaclasses). type has a __call__ method that is responsible for constructing instances. It works something like: class type: def __call__(cls, *args, **kwargs): self = cls.__new__(cls, *args, **kwargs) if isinstance(self, cls): cls.__init__(self, *args, **kwargs) Note, the above is for demonstrative purposes only. Remember that, if a function is not defined on a class itself, it is looked up on its parent (as controlled by the mro), and usually. Ultimately, __new__ must either call object.__new__(cls) to allocate a new instance of a class cls, or else return an existing object. If the existing object is of a different class, __init__ will not be called. Note that if it returns an existing object of the right class (or a subclass), __init__ will be called more than once. For such classes, all of the work is usually done in __new__. Chances are you'll never use any of this, but it might help you understand what's going on behind the scenes.

答案 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可以操纵对象本身的数据。否则你最终会编辑全局变量。