【问题标题】:What is the meaning of 'self' and '__init__' expressions in Python? [closed]Python中'self'和'__init__'表达式的含义是什么? [关闭]
【发布时间】:2009-11-20 11:06:54
【问题描述】:

我不明白这些是做什么用的,尤其是 self 参数?有人可以向我解释一下,你到底为什么要传递这个?

另外,我一直认为__init__ 是用于“初始化”,但我没有想到我以前从未需要在这里放任何东西。谁能给我一个简单的例子?

编辑:每次看到self 被传递到函数或类似的东西时,我都会感到非常困惑。

【问题讨论】:

  • 请不要将“Self”大写。它写成self。小写。你在读什么 Python 教程?请提供链接或书名。

标签: python self init


【解决方案1】:

self 是您正在调用该方法的对象。有点像Java中的this

__init__ 在创建每个对象时对其进行初始化以对其进行初始化。就像Java中的构造函数。

因此,当您想在创建对象时设置对象的任何属性(Java 中的成员变量)时,您可以使用__init__。如果您对“空”对象感到满意,则不需要 __init__ 方法,但如果您想创建带有参数的对象,则需要一个。

一个例子是:

class StackOverflowUser:
    def __init__(self, name, userid, rep): 
        self.name = name
        self.userid = userid
        self.rep = rep

dave = StackOverflowUser("Dave Webb",3171,500)

然后我们可以查看我们创建的对象:

>>> dave.rep
500
>>> dave.name
'Dave Webb'

所以我们可以看到__init__self 一起传递给构造函数的参数,self 是对已创建对象的引用。然后我们在处理参数并适当地更新对象时使用self

问题是为什么 Python 有 self 而其他语言不需要它。根据Python FAQ

为什么必须在方法定义和调用中显式使用“self”?

首先,更明显的是您使用的是方法或实例属性而不是局部变量...

其次,这意味着如果你想显式引用或调用特定类的方法,则不需要特殊的语法......

最后,例如变量,它解决了赋值的语法问题:因为 Python 中的局部变量(根据定义!)是那些在函数体中赋值的变量(并且没有显式声明为全局变量),所以必须以某种方式告诉解释器赋值是指分配给实例变量而不是局部变量,并且最好是语法(出于效率原因)...

【讨论】:

    【解决方案2】:

    按照惯例,self 是您要调用其方法的对象的实例。

    例如:

    class MyClass:
      """A simple example class"""
      def __init__(self):
        print "MyClass class created"
      i = 12345
      def f(self):
        return self.i
    
    # Create an object called a of type MyClass. This will print "MyClass class created"
    a = MyClass()
    
    # Run the method - should return 12345
    print a.f()
    
    # Make another instance of the class to illustrate they are separate.
    b = MyClass()
    # Set a.i to another value.
    a.i = 1
    
    # Note the result
    print a.f()
    print b.f()
    

    顺便说一句,你不必叫它自己,你可以随便叫它。它始终是第一个参数。

    【讨论】:

    • 我明白了,如果你愿意,'self' 会改变范围吗?为了说“我要访问这个值i,但首先我需要说它在哪里,因为它不是方法的本地?”
    【解决方案3】:

    将其视为 C++ / Java 中的“this”参数:它用于引用类的实例。

    Class Whatever:   
      def __init__(self, some_parameter):   
        self.instance_parameter = some_parameter
    

    __init__ 视为类实例构造函数

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 2022-12-08
      • 2017-08-28
      • 2015-11-04
      • 1970-01-01
      • 2020-06-16
      相关资源
      最近更新 更多