了解Python中的对象类型

时间:2018-08-29 13:53:47

标签: python c++ object

我一直使用C ++进行编程,现在我正在学习Python。 我发现在Python中缺少对象声明非常令人困惑,尤其是在定义类之前没有声明类成员这一事实。

例如,在C ++中,我会写:

Class ComplexNumber {
    protected:
    int _re,_im;

    public:
    ...

}

在Python中,将缺少_re和_im的声明,并且它们的初始化将隐藏在公共成员的定义中。幸运的话,您可以在构造函数中找到它们,但是有时它们会在其他成员中初始化。

是否有任何方法可以在不读取整个代码的情况下找出Python中类的完整结构?特别是,我对类中包含的“变量”(及其类型)的完整列表感兴趣,在C ++中,这些变量通常是受保护的/私有成员。

谢谢。

1 个答案:

答案 0 :(得分:0)

Python是一种动态语言。变量没有类型,变量保存对对象的引用。只有对象具有类型。因此,在运行时之前,无法知道变量的类型。 Python开发人员应使用清晰明确的文档来解决此问题,并说明预期的类型。

在运行时,我们可以看到python对象(实例,而不是类)的每个属性(又名成员)的类型是什么:

def types_of_instance_attributes(instance):
    return {k: type(v) for k, v in vars(instance).items()}

但是,在python 3.6+中,静态类型提示已成为该语言的一部分,可以帮助用户进行记录并允许静态类型检查器更好地工作。这些看起来更类似于C ++:

class ComplexNumber:

    _re: int
    _im: int

    def __init__(self, real: int, imaginary: int) -> None:
         self._re = real
         self._im = imaginary

    def magnitude(self) -> float:
       return (self._re**2 + self._im**2)**0.5


com = ComplexNumber(12, -3)

x = com._re  # type checker knows is an int
y = com.magnitude()  # type checker knows is a float
z: str = com._im  # ERROR in type checker (int -> str mismatch)