我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
当前回答
简而言之:
正如它所暗示的那样,Self指的是它自己——调用方法的对象。也就是说,如果你有N个对象调用这个方法,那么self。a将引用N个对象中每个对象的变量的一个单独实例。假设每个对象有N个变量a的副本 __init__在其他OOP语言(如c++ /Java)中被称为构造函数。基本思想是,它是一个特殊的方法,当创建该类的对象时自动调用
其他回答
一个简单的说明性例子
希望它能有所帮助,这里有一个简单的例子,我用它来理解在类中声明的变量和在__init__函数中声明的变量之间的区别:
class MyClass(object):
i = 123
def __init__(self):
self.i = 345
a = MyClass()
print(a.i)
print(MyClass.i)
输出:
345
123
__init__基本上是一个函数,它将为特定对象“初始化”/“激活”类的属性,一旦创建并匹配到相应的类。 Self表示将继承这些属性的对象。
只是这个问题的一个演示。
class MyClass:
def __init__(self):
print('__init__ is the constructor for a class')
def __del__(self):
print('__del__ is the destructor for a class')
def __enter__(self):
print('__enter__ is for context manager')
return self
def __exit__(self, exc_type, exc_value, traceback):
print('__exit__ is for context manager')
def greeting(self):
print('hello python')
if __name__ == '__main__':
with MyClass() as mycls:
mycls.greeting()
$ python3 class.objects_instantiation.py
__init__ is the constructor for a class
__enter__ is for context manager
hello python
__exit__ is for context manager
__del__ is the destructor for a class
基本上,当在同一个类中的多个函数中使用一个变量时,需要使用'self'关键字。至于init,它用于设置默认值,以防该类中没有其他函数被调用。
在这段代码中:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... self变量表示对象本身的实例。大多数面向对象语言将此作为一个隐藏参数传递给对象上定义的方法;Python则不然。你必须显式地声明它。当你创建一个A类的实例并调用它的方法时,它将被自动传递,就像在…
a = A() # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument
__init__方法大致代表Python中的构造函数。当你调用A()时,Python为你创建一个对象,并将其作为第一个参数传递给__init__方法。任何额外的参数(例如,A(24, 'Hello'))也会作为参数传递——在这种情况下会引发异常,因为构造函数并不期望它们。