

Python初学者です。参考書にて基礎から学びつつ、応用としてpygameを使った学習を行っています。

メインモジュール内でShipクラスのインスタンス生成時にShip()の引数として、何故selfを指定しているのか分かりません。これまで進めてきた参考書にも記載は無く、他にもネットなどで調べてみても（私の調べ方の問題もあると思っています。）分かりませんでした。お分かりになる方がいらっしゃいましたら、ご教授いただければ幸いです。

メインモジュール

[code]

    import sys
    
    import pygame
    
    from settings import Settings
    
    from ship import Ship
    
    class AlienInvasion:
        """overall class to manage game assets and behavior."""
        def __init__(self):
            """Initialize the game, and create game resources."""
            pygame.init()
    
            self.settings = Settings()
    
            """To create a display window"""
            self.screen = pygame.display.set_mode(
                (self.settings.screen_width, self.settings.screen_height))
    
            pygame.display.set_caption("Alien Invasion")
    
            ## ** This is where I am confused about!!!!
            self.ship = Ship(self)
    
        def run_game(self):
            """Start the main loop of the game"""
            while True:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        sys.exit()
    
                self.screen.fill(self.settings.bg_color)
    
                self.ship.blitme()
    
                pygame.display.flip()
    
    
    if __name__ == '__main__':
        ai = AlienInvasion()
        ai.run_game()
    
[/code]

settings.pyモジュール

[code]

    class Settings:
        """A class to stroe all settings for Alien Invasion"""
        def __init__(self):
            self.screen_width = 900
            self.screen_height = 600
            self.bg_color = (230, 230, 230)
    
[/code]

ship.pyモジュール

[code]

    import pygame
    
    class Ship:
        """A class to manage the ship."""
        def __init__(self, ai_game):
            """Initialize the ship and set its starting position."""
    
            self.screen = ai_game.screen
    
            self.screen_rect = ai_game.screen.get_rect()
    
            self.image = pygame.image.load('images/ship.bmp')
    
            self.rect = self.image.get_rect()
    
            self.rect.midbottom = self.screen_rect.midbottom
    
        def blitme(self):
            """Draw the ship at its current location."""
            self.screen.blit(self.image, self.rect)
    
[/code]


CC BY-SA 4.0
2022-04-26T06:13:58.880
88508
2022-04-26T09:05:21.393
2022-04-26T08:57:45.027
3060
52366
question
python pygame
pygameでインスタンス生成時に引数として、何故selfを指定しているのか分かりません


selfというのはそのクラス自身を指す変数です。  
例えば、AlienInvasionクラスでは、  
作成されたAlienInvasionクラスにselfを使って  
値を格納しています。  
おそらく、Pythonを使ったオブジェクト指向プログラミングについて  
学習しなかったのではないかと思います。


CC BY-SA 4.0
2022-04-26T06:25:18.480
88509
2022-04-26T06:25:18.480
4188
88508
answer


**コメント対応で更新**

済みませんね。質問を良く見ていませんでした。  
**メインモジュール内でShipクラスのインスタンス生成時にShip()の引数として、何故selfを指定しているのか分からず。**

これについては、`self.ship = Ship(self)`の`Ship(self)`の **self** は、`class Ship:`の`def
__init__(self, ai_game):`に渡される2つ目の引数 **ai_game** になります。

`class Settings:`の`def __init__(self):`には self
以外の引数は無いので`Settings`のインスタンスを作成する`self.settings =
Settings()`には引数指定は無いですが、`class Ship:`の`def __init__(self, ai_game):`には2つ目の引数
ai_game があり、`ship`のインスタンスを作成するためには`class
AlienInvasion:`のインスタンスをそこに指定する必要があるため、`Ship(self)`という呼び出し方になっている訳です。

* * *

**以下は回答としてはちょっと的外れな 引数 self がどういう物かの解説**

`Pygame`に依存したものでは無く、`Python`自身の仕様と習慣的な使い方ですね。

ちょっと説明不足な感じですが、Pythonのドキュメントには以下のように書かれています。  
[9\. クラス](https://docs.python.org/ja/3/tutorial/classes.html)  
[9.4. いろいろな注意点](https://docs.python.org/ja/3/tutorial/classes.html#random-
remarks)

> よく、メソッドの最初の引数を`self`と呼びます。この名前付けは単なる慣習でしかありません。`self`という名前は、 Python
> では何ら特殊な意味を持ちません。とはいえ、この慣行に従わないと、コードは他の Python プログラマにとってやや読みにくいものとなります。また、
> クラスブラウザ (class browser) プログラムがこの慣行をあてにして書かれているかもしれません。  
>  メソッドは、`self`引数のメソッド属性を使って、他のメソッドを呼び出すことができます:

この説明では`self`という名前付けは習慣であって、実は何でも良いように書かれていますが、`最初の引数`が何であるかは明確には書かれていません。

Pythonのclassに属するメソッドを定義する際の最初の引数は自分自身のインスタンスをあらわしています。

他のオブジェクト指向言語では`this`と呼ばれるものと同じです。  
こちらの記事が多数の言語について説明していて分かりやすいでしょう。  
[this (プログラミング) -
Wikipedia](https://ja.wikipedia.org/wiki/This_\(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0\))

>
> `this`は、プログラミング言語に出てくる概念のひとつで、自身の動いているオブジェクトを指す予約語。主にインスタンスメソッド内で使用される。`this`の他に`self`、`Me`といった語を使う言語もあるが、...(以下省略)

> **Python**  
>  Python
> では、`this`は文法上の予約語ではないが、自動的に対象となるオブジェクトが渡される、メンバ関数の1つ目の引数となっている。慣習的に、この引数の名前として`self`が使われる。

* * *


CC BY-SA 4.0
2022-04-26T07:22:20.877
88512
2022-04-26T09:05:21.393
2022-04-26T09:05:21.393
26370
26370
88508
answer