为什么必须使用__new__初始化对象?

时间:2018-10-26 10:12:20

标签: python pygame pycharm

我正在尝试使用pygame在Python中制作游戏,但是我不小心禁用了PyCharm中的错误检查功能。结果,这就是我尝试初始化Vector2的方式:

self.vel = pg.Vector2(0, 0)
self.acc = pg.Vector2(0, self.GRAVITY)

重新启用错误检查后,PyCharm给了我一条错误消息,告诉我改用pg.Vector2.__new__(0, 0)。完成后,错误消息消失并且代码可以正常工作。

现在是实际问题:

虽然禁用了错误消息,但我还是写了很多错误的代码,如上面的示例。奇怪的是,代码实际上运行良好。即使一半的代码有错误,游戏也可以启动并正常运行。

有人可以向我解释一下上面的示例为何起作用,但是为什么认为它不好?

完整代码:

import pygame as pg
from game.settings import *


class Player(pg.sprite.Sprite):
    """
    I'm a docstring hurr durr
    """

    ACCELERATION = 60 / FPS  # dummy value
    FRICTION = 1  # dummy value
    GRAVITY = 1  # dummy value
    LIFE = 5

    def __init__(self, x, y, h, w):
        super().__init__()

        self.x = x  # x position
        self.y = y  # y position
        self.h = h  # height
        self.w = w  # width

        self.vel = pg.Vector2.__new__(0, 0)
        self.acc = pg.Vector2.__new__(0, self.GRAVITY)

        self.rect = pg.Rect(x, y, w, h)

        self.image = pg.Surface(w, h)
        self.image.fill(RED)
        # self.image = pg.image.load("../resources/player.*")

    def update(self):
        # key updates
        keys = pg.key.get_pressed()
        if keys[pg.K_LEFT]:
            self.acc.x -= self.a
        if keys[pg.K_RIGHT]:
            self.acc.x += self.a
        # test jumping function
        if keys[pg.K_SPACE]:
            self.vel.y = -20

        # friction
        self.acc.x -= self.vel.x * self.FRICTION

        # update vel and pos
        self.vel.x += self.acc.x
        self.x += self.vel.x

        self.vel.y += self.acc.y
        self.y += self.vel.y

1 个答案:

答案 0 :(得分:4)

这里的问题是PyCharm不知道__init__方法的真实签名应该是什么,因为该文件是作为.pyd文件(如.dll)分发的。您可以通过在代码中pg.Vector2上的pycharm中使用“转到...声明”(Ctrl + B)函数来进行验证,然后在pyame的pygame.math.Vector2中的__init__.py上使用,直到输入pygame.math的代码。在这里,您会看到这样的声明:

def __init__(self): # real signature unknown; restored from __doc__
    pass

还请注意此math.py文件顶部的注释:

# from C:\Users\User\AppData\Local\Programs\Python\Python35\lib\site-packages\pygame\math.cp35-win_amd64.pyd
# by generator 1.145

PyCharm正在尽最大努力尝试生成类似于实际代码的东西,但这只是一个猜测。

简而言之,您是对的,在这种情况下pycharm是错误的。

这里描述了完全相同的问题类型:

Why do some built-in Python functions only have pass?

相关问题