我正在学习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)中被称为构造函数。基本思想是,它是一个特殊的方法,当创建该类的对象时自动调用
其他回答
self做什么?这意味着什么?这是强制性的吗?
每个类方法(包括init)的第一个参数始终是对类当前实例的引用。按照惯例,这个参数总是命名为self。在init方法中,self指向新创建的对象;在其他类方法中,它引用被调用方法的实例。
Python不会强制你使用"self"。你可以给它起任何你想要的名字。但是记住方法定义中的第一个参数是对对象的引用。Python为你将self参数添加到列表中;在调用方法时不需要包含它。 如果你没有在init方法中提供self,那么你会得到一个错误
TypeError: __init___() takes no arguments (1 given)
init方法做什么?为什么有必要?(等)
Init是initialization的缩写。它是一个构造函数,当你创建类的实例时调用它,这是不必要的。但通常我们的做法是编写init方法来设置对象的默认状态。如果你不愿意在初始时设置对象的任何状态,那么你不需要编写这个方法。
只是这个问题的一个演示。
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
一个简单的说明性例子
希望它能有所帮助,这里有一个简单的例子,我用它来理解在类中声明的变量和在__init__函数中声明的变量之间的区别:
class MyClass(object):
i = 123
def __init__(self):
self.i = 345
a = MyClass()
print(a.i)
print(MyClass.i)
输出:
345
123
__init__确实像一个构造函数。如果您希望任何类函数表现为非静态方法,则需要将“self”作为第一个参数传递给它们。self是类的实例变量。
我自己也很难理解。即使在看完答案之后。
要正确理解__init__方法,你需要理解self。
self参数
__init__方法接受的参数是:
def __init__(self, arg1, arg2):
但实际上我们只传递了两个参数:
instance = OurClass('arg1', 'arg2')
额外的论证从何而来?
当我们通过名称(或引用)访问对象的属性时。这里的instance是对新对象的引用。我们使用instance.printargs访问实例对象的printargs方法。
为了从__init__方法中访问对象属性,我们需要一个对象引用。
每当调用方法时,对主对象的引用将作为第一个参数传递。按照惯例,你总是调用方法self的第一个参数。
这意味着在__init__方法中我们可以这样做:
self.arg1 = arg1
self.arg2 = arg2
这里我们在对象上设置属性。您可以通过以下方法验证这一点:
instance = OurClass('arg1', 'arg2')
print instance.arg1
arg1
这样的值称为对象属性。这里__init__方法设置实例的arg1和arg2属性。
来源:http://www.voidspace.org.uk/python/articles/OOP.shtml init方法