Python 为什么需要使用_unew _u初始化对象?

Python 为什么需要使用_unew _u初始化对象?,python,pygame,pycharm,Python,Pygame,Pycharm,我试图使用pygame在Python中制作一个游戏,但我意外地禁用了PyCharm中的错误检查。因此,这就是我试图初始化向量2的方式: self.vel = pg.Vector2(0, 0) self.acc = pg.Vector2(0, self.GRAVITY) 在我重新启用错误检查后,PyCharm给了我一条错误消息,告诉我使用pg.Vector2.\uuuu new\uuuu(0,0)。之后,错误信息消失了,代码正常工作 现在是实际问题: 当错误消息被禁用时,我编写了很多像上面例子一

我试图使用pygame在Python中制作一个游戏,但我意外地禁用了PyCharm中的错误检查。因此,这就是我试图初始化向量2的方式:

self.vel = pg.Vector2(0, 0)
self.acc = pg.Vector2(0, self.GRAVITY)
在我重新启用错误检查后,PyCharm给了我一条错误消息,告诉我使用
pg.Vector2.\uuuu new\uuuu(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

这里的问题是PyCharm不知道
\uuuu init\uuuu
方法的真正签名应该是什么,因为该文件是作为文件分发的(如.dll)。您可以通过在代码中的
pg.Vector2
上使用pycharm中的“Go to…Declaration”(Ctrl+B)函数,然后在pyame的
中的
pygame.math.Vector2
上使用pycharm中的“Go to…Declaration”(Ctrl+B)函数来验证这一点,直到您达到
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是错的

此处描述了完全相同类型的问题:


我们能再看一点背景吗?你贴的那两行代码在哪里?这是在
\uuuu init\uuuu
方法中吗?还是采用
\uuuuuuuuuuuuuuuuuu
方法?我们能做一个吗?@Aran Fey完成了。但是我看不到任何这样的错误(或警告)。在这种情况下显式使用
\uuuuuu new\uuuu
听起来是错误的。PyCharms的警告消息到底是什么?您使用什么版本的PyCharm(以及哪些插件)?意外参数可能被调用者:Vector2(self:Vector2)Vector2.\uuuuuuuuuuu新的(*args,**kwargs)