如何创建不属于标准数据类型的类属性?

时间:2008-12-19 03:03:34

标签: python pygame

我有一个类需要获取在另一个中设置的属性。但它不是标准数据类型。这是代码;

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"

我需要做的是引用screen属性,我可以使用self.screen设置并在该类中可读...但是我必须设置另一个类

screen = ?

class graphics:

该问号需要是什么?我试过0,没有,“”......似乎没什么用,我不知道pygame调用的数据类型是什么。 :S

4 个答案:

答案 0 :(得分: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__方法中所做的就是完全我们上面所做的:设置实例的属性,{{1} }。

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) 可以在此类定义之后的任何位置使用,如上面代码段中的第一个assert语句所示。

编辑:不要忘记查看the Python Tutorial's section on classes,其中包含所有这些以及更多内容。

答案 1 :(得分:0)

可能是object类型

self.screen = object()

可能有效(如果我理解你的问题)。

答案 2 :(得分: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"

答案 3 :(得分: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.thisGraphics.that来引用类本身的属性。