我有一个类需要获取在另一个中设置的属性。但它不是标准数据类型。这是代码;
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
答案 0 :(得分:1)
我认为Python中类和实例属性之间的差异的简短解释可能对您有所帮助。
当你编写这样的代码时:
class Graphics:
screen_size = (1024, 768)
类Graphics
实际上是一个对象本身 - 一个类对象。因为您在其中定义了screen_size
,所以screen_size
是Graphics
对象的属性。您可以在以下内容中看到:
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.this
或Graphics.that
来引用类本身的属性。