gpt4 book ai didi

python - 为什么一定要用__new__来初始化一个对象?

转载 作者:太空狗 更新时间:2023-10-30 02:52:32 26 4
gpt4 key购买 nike

我正在尝试使用 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

最佳答案

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

关于python - 为什么一定要用__new__来初始化一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53006412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com