Python 为什么需要使用_unew _u初始化对象?
我试图使用pygame在Python中制作一个游戏,但我意外地禁用了PyCharm中的错误检查。因此,这就是我试图初始化向量2的方式: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)。之后,错误信息消失了,代码正常工作 现在是实际问题: 当错误消息被禁用时,我编写了很多像上面例子一
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)