2008-12-19 14 views
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,沒有,「」......似乎沒有任何工作,我不知道pygame調用的數據類型是什麼。 :S

回答

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" 

下面是獲取或設置對象屬性的示例。我們從類(Graphics)創建的對象(g

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) 

注意。我們根本不經常參考這個班。使用類名稱的唯一時間就是創建對象實例(Graphics())。我們很少說Graphics.thisGraphics.that指的是類本身的屬性。

0

很可能一個object型等等

self.screen = object() 

可能工作(如果我理解正確你的問題)。

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" 
+0

這並不是你想要的。您有同名的類級屬性(屏幕)和實例級屬性。 – 2008-12-19 03:27:41

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可以在任何地方這個類定義後使用,如圖與上述代碼段中的第一斷言語句。

編輯:不要忘了檢查出the Python Tutorial's section on classes,它涵蓋了所有這些和更多。