どのように標準的なデータ型ではないクラス属性を作るのですか?

StackOverflow https://stackoverflow.com/questions/379995

  •  22-08-2019
  •  | 
  •  

質問

私は別に設定された属性をつかむ必要がある1つのクラスを持っています。これは、しかし、標準のデータ型ではありません。ここでは、コードがあります。

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:

何という疑問符がする必要がありますか。私は、私はpygameのコールがどうなるかのデータ型見当がつかない、...何も動いていないようにみえ「」、0、どれを試していないてきました。 :S

役に立ちましたか?

解決

あなたはめったに、もしこれまで、クラスの参照属性。あなたは、オブジェクトの属性を参照します。

(また、クラス名は大文字する必要があります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は、クラス自体の属性を参照するために言っていない。

他のヒント

私は、クラスとインスタンスは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文で示すように、このクラス定義の後にどこでも使用することができる。

編集:そして、クラス

それはとてもそうobjectタイプです。

self.screen = object()
(私が正しくあなたの質問を理解している場合)

動作する可能性があります。

うわ... PEBKACます。

私はので、私はあなただけDEFS外プロトタイプ以上のことを行うことができます忘れ続けるCに使用しています。

このように書き直し、それが働いた:

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"
scroll top