0

別のクラスで設定されている属性を取得する必要があるクラスがあります。ただし、標準のデータ型ではありません。コードは次のとおりです。

class graphics:
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"

私がする必要があるのは、self.screenで設定してそのクラス内で読み取ることができる画面属性を参照することです...しかし、別のクラスから設定する必要があります

screen = ?

class graphics:

その疑問符は何である必要がありますか? 私は 0, None, "" を試しました...何も機能していないようです.pygame呼び出しがどのようなデータ型になるのかわかりません. :S

4

4 に答える 4

1

Python でのクラス属性とインスタンス属性の違いを簡単に説明すると、役に立つと思います。

次のようなコードを書くと:

class Graphics:
    screen_size = (1024, 768)

クラスGraphicsは実際にはオブジェクトそのもの、つまりクラス オブジェクトです。screen_sizeその中で定義したので、screen_sizeGraphicsオブジェクトの属性です。これは以下で確認できます。

assert Graphics.screen_size == (1024, 768)

Python では、これらのクラス オブジェクトを関数のように使用できます。呼び出し構文を使用するだけです。

g = Graphics()

gクラスの「インスタンス」と呼ばれますGraphics。クラスのインスタンスを作成すると、インスタンスの属性と一致しないすべての属性ルックアップは、次にクラス オブジェクトの属性を調べます。それが、このルックアップが機能する理由です。

assert g.screen_size == (1024, 768)

ただし、インスタンスに同じ名前の属性を追加すると、インスタンスのルックアップは成功し、クラス オブジェクトを探す必要がなくなります。基本的に、インスタンスに直接設定された値でクラス オブジェクトの値を「マスク」します。これは、クラス オブジェクトの属性の値を変更しないことに注意してください。

g.screen_size = (1400, 1050)
assert g.screen_size == (1400, 1050)
assert Graphics.screen_size == (1024, 768)

したがって、__init__メソッドで行っていることは、まさに上で行ったことです:インスタンスの属性を設定しますself

class Graphics:

    screen_size = (1024, 768)

    def __init__(self):
        self.screen_size = (1400, 1050)

g = Graphics()
assert Graphics.screen_size == (1024, 768)
assert g.screen_size == (1400, 1050)

Graphics.screen_size上記のスニペットの最初の assert ステートメントで示されているように、このクラス定義の後の任意の場所で値を使用できます。

編集: そして、クラスに関する Python チュートリアルのセクションをチェックすることを忘れないでください。

于 2008-12-19T11:01:06.467 に答える
0

うーん...PEBKAC。

私は C に慣れすぎて、defs の外でプロトタイプ以外のことができることを忘れがちです。

このように書き直して、うまくいきました:

class graphics:
SCREEN_SIZE = (640, 480)
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    self.SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"
于 2008-12-19T03:22:25.580 に答える
0

クラスの属性を参照することはめったにありません。オブジェクトの属性を参照します。

(また、クラス名は大文字にする必要があります: Graphics)。

class Graphics:
SCREEN_SIZE = (640, 480)
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    self.SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"

オブジェクトの属性を取得または設定する例を次に示します。

g= Graphics() # create an object
# access the object's instance variables
print "screen", g.screen
g.screen= pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)

gクラス ( ) からオブジェクト ( ) を作成したことに注意してくださいGraphics。クラスをあまり頻繁に参照することはありません。クラス名が使用されるのは、ほとんどの場合、オブジェクト インスタンス ( Graphics()) を作成する場合のみです。クラス自体の属性について言及したり参照しGraphics.thisたりすることはめったにありません。Graphics.that

于 2008-12-19T03:28:48.360 に答える
0

多分objectタイプなので

self.screen = object()

うまくいくかもしれません(あなたの質問を正しく理解していれば)。

于 2008-12-19T03:09:01.613 に答える