1

私は Python の初心者で、現在、私の著書「絶対的な初心者のための Python プログラミング」の第 10/12 章を読んでいます。私は Python で OOP を理解していますが、ある章 (OOP に関するいくつかの関連情報について説明しています) が「カード」をプレイするためのプログラムに基づいているため、その章の一部をスキップする必要がありました (カードのプレイ方法がわからないため)。そのため、本のこの時点で知っておくべき重要な情報を見逃していました。私がこれを言っている理由は、複雑な答えは私には解釈が難しすぎるかもしれないので、私の質問には簡単な答えが必要だからです.

しかし、とにかくここに私の問題があります.私の本には単純なGUIプログラムを作成するコードの一部があり(私は完全に理解しています)、私が理解していないプログラムのオブジェクト指向バージョンがあります(主要部分は「 ## の)。これには、「スーパークラス コンストラクター」と呼ばれるものが含まれており、私を完全に混乱させました (調査を試みましたが、意味がわかりませんでした)。コードの 2 番目のバージョンがどのように機能するかを説明してくれる人 (または役立つリソースを提供してくれる人) があれば、非常に感謝しています。

コードの最初のバージョン:

from tkinter import *

# create a root window
root = Tk()
root.title("Lazy Buttons")
root.geometry("200x85")

app = Frame(root)
app.grid()

bttn1 = Button(app, text = "This is a button")
bttn1.grid()

root.mainloop()

2 番目のバージョン:

from tkinter import *

class Application(Frame):

    def __init__(self, master): # Why is 'master' called?
        super(Application, self).__init__(master)    # ?
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.bttn1 = Button(self, text = "This is a button")
        self.bttn1.grid()

root = Tk()
root.title("Lazy Buttons 2")
root.geometry("200x85")
app = Application(root)
root.mainloop()
4

2 に答える 2

1

問題のドメインがわからないため、チュートリアルの一部をスキップしないでください。カードゲームのコードがプログラムの動作にどのように関連しているかを理解するために、カードのプレイ方法を知る必要はありませ。あなたの実際の問題に:

class Application(**Frame**):

これにより、クラスApplicationから継承するクラスが作成されFrameます。継承がわからない場合は、次のチュートリアルで説明する必要があります。または、私がグーグルで調べたクラスと継承の概要を試すこともできます。

**def __init__(self, master):

これにより、という名前のメソッドが作成されます__init__。これはPythonの特別なメソッドであり、他の言語のコンストラクターと同様に動作します。基本的に、Pythonは、が作成されるたびに、新しいオブジェクトを作成した人に返す前にApplication、すぐにそのメソッドを呼び出します。他の関数と同じように、単なる引数です。__init__master

super(Application, self).__init__(master)

これにより、スーパークラスのコンストラクターが呼び出され、新しいオブジェクトが初期化されます。スーパークラスがsuper(Application, self)何であるかを理解します(この場合はそうです;最終的に到達するより複雑なケースでは、これは解決するのが難しく、の魔法が重要になります)。Framesuper

self.create_widgets()**

create_widgetsこれにより、この下で定義するメソッドが呼び出されます。の前のオブジェクト.が最初の引数としてメソッドに渡されselfます。つまり、これは、現在のメソッドが呼び出されたのと同じオブジェクトで別のメソッドを呼び出します。

app = Application(root)

これにより、リストの作成Application方法と同様に、クラスを呼び出すことによってオブジェクトが作成されlist()ます。渡した引数は2番目の引数として渡されます( Pythonが舞台裏で作成し__init__た新しい引数は、上記のように最初の引数として渡されます)。Pythonは新しいを作成し、それを呼び出してから、新しいオブジェクトを「app」という名前に割り当てます。ApplicationselfApplication__init__

于 2012-08-17T11:13:03.647 に答える
0

ここでの「スーパー」部分は、基本クラス(継承元のクラス)のコンストラクターを適切に呼び出すためだけです。次の例を考えてみましょう。

class Device():  # class representing some drawing device
    ...
    def fill(self, color)
        ...  # actual code for draw on this device

screen = Device()
WHITE_COLOR = (255, 255, 255)

class Window(object):
    def __init__(self, width, height):
        self.width  = width
        self.height = height

    def area(self):
        return self.width * self.height

class ColoredWindow(Window):
    def __init__(width, height, color):
        super(ColoredWindow, self).__init__(width, height)
        self.color = color

    def fill(self):
        screen.fill(self.width, self.height, self.color)

my_window = ColoredWindow(640, 480, WHITE_COLOR)
my_window.fill()

ここでの最初のクラスは、コンストラクターに渡されると の属性を Window持つ汎用ウィンドウです。は のサブスカであり、追加の属性 があります。が構築されると、何らかの形でその baseclass にパスとパラメーターが必要になります。widthheightColoredWindowWindowcolorColoredWindowwidthheightWindow

まさにこれが建設super(ColoredWindow, self).__init__(width, height)の目的です。最初の部分 は基底クラス (この場合)super(ColoredWindow, self)への参照を返し、 2 番目の部分は適切なパラメーターを使用してそのコンストラクターを呼び出すだけです。Window__init__(width, height)

あなたの例では呼び出されていません。クラスのメソッドmasterへの単なるパラメーターです。__init__Application

于 2012-08-17T11:54:56.357 に答える