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

编辑:不要忘记查看Python 教程中关于 classes 的部分,它涵盖了所有这些以及更多内容。

于 2008-12-19T11:01:06.467 回答
0

这可能是一种object类型

self.screen = object()

可能有效(如果我正确理解了您的问题)。

于 2008-12-19T03:09:01.613 回答
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.thisGraphics.that提及类本身的属性。

于 2008-12-19T03:28:48.360 回答