【问题标题】:How do you make a class attribute that isn't a standard data type?你如何制作一个不是标准数据类型的类属性?
【发布时间】:2010-09-27 15:46:22
【问题描述】:

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

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, None, "" ...似乎没有任何效果,我不知道 pygame 调用的数据类型是什么。 :S

【问题讨论】:

    标签: python pygame


    【解决方案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)
    

    如果我们向 instance 添加一个同名的属性,那么对实例的查找将会成功,并且它不必去查找类对象。您基本上使用直接在实例上设置的值“屏蔽”类对象的值。请注意,这不会改变类对象中属性的值:

    g.screen_size = (1400, 1050)
    assert g.screen_size == (1400, 1050)
    assert Graphics.screen_size == (1024, 768)
    

    所以,您在 __init__ 方法中所做的正是我们在上面所做的:设置 instance 的属性,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可以在这个类定义之后的任何地方使用,如上面sn-p中的第一个assert语句所示。

    编辑:别忘了查看the Python Tutorial's section on classes,它涵盖了所有这些以及更多内容。

    【讨论】:

      【解决方案2】:

      你很少,如果有的话,引用一个类的属性。您引用对象的属性。

      (另外,类名应为大写: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)
      

      请注意,我们从类 (Graphics) 创建了一个对象 (g)。我们根本不经常引用该类。几乎唯一一次使用类名是创建对象实例 (Graphics())。我们很少使用Graphics.thisGraphics.that 来引用类本身的属性。

      【讨论】:

        【解决方案3】:

        很可能是object 类型

        self.screen = object()
        

        可能会起作用(如果我正确理解了您的问题)。

        【讨论】:

          【解决方案4】:

          呃...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"
          

          【讨论】:

          • 这不会真正达到您的预期。您同时拥有同名的类级属性(屏幕)和实例级属性。
          • 如果您将此作为答案发布,我会向您 + 代表...现在我开始了解它是如何工作的。我仍然是个新手,但至少我正在盯着看发生了什么事。大声笑。
          • 是的...在凌晨 4 点在编写了大约 20 小时的代码后阅读论坛可能是个坏主意。我什至能够直截了当地找到执行按钮,甚至找到错误,这真是一个奇迹。 >.
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-20
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 1970-01-01
          • 2022-12-19
          相关资源
          最近更新 更多