方法签名的参数类型(self)

12 浏览
0 Comments

方法签名的参数类型(self)

当我定义一个类时,如何在其方法的签名中包含必须为同一类的参数?我正在构建一个类似于这样工作的图结构,但这里是一个简化的例子:\n

class Dummy:
    def __init__(self, value: int, previous: Dummy=None):
        self._value = value
        self._previous = previous
    @property
    def value(self):
        return self._value
    def plus_previous(self):
        return self.value + self._previous.value
d1 = Dummy(7)
d2 = Dummy(3, d1)
d2.plus_previous()

\n这导致以下错误:\n

NameError: name 'Dummy' is not defined

\n我的意思是,我可以按照Python 2的方式做,但我希望有一个更符合Python 3的解决方案,而不是这样:\n

class Dummy:
    def __init__(self, value: int, previous=None):
        assert type(previous) is Dummy or previous is None
        ...

0
0 Comments

从上面的内容中可以看出,出现(Method signature arguments of type(self))这个问题的原因是在类型提示时,当类型还未定义时,可以使用字符串作为类型提示。这种情况经常出现在定义容器类时,其中的方法的签名中包含了正在定义的类。然而,使用字符串作为类型提示存在一个问题,就是如果在IDE中进行重命名操作,IDE可能不会考虑这些字符串字面量,导致重命名失败。

解决这个问题的方法是在类型提示中使用字符串字面量来表示还未定义的类型。字符串字面量应该是一个有效的Python表达式,并且在模块完全加载后能够正常评估,同时在评估时使用的本地和全局命名空间应该与同一函数的默认参数的评估时使用的命名空间相同。

虽然这种方法解决了类型提示中未定义类型的问题,但是在IDE中进行重命名操作时可能会出现问题。IDE可能无法识别这些字符串字面量并进行相应的重命名操作。

0