Понимание типа объекта в Python - PullRequest
0 голосов
/ 29 августа 2018

Я всегда программировал на C ++ и сейчас изучаю Python. Я нахожу очень запутанным отсутствие объявления объектов в Python, особенно тот факт, что члены классов не объявляются до того, как будут определены.

Например, в C ++ я бы написал:

Class ComplexNumber {
    protected:
    int _re,_im;

    public:
    ...

}

В Python объявление _re и _im отсутствует, а их инициализация будет скрыта в определении открытых членов. Когда вам повезет, вы найдете их в конструкторе, но иногда они инициализируются в других членах.

Есть ли какой-нибудь метод, чтобы выяснить полную структуру классов в Python, не читая весь код? В частности, меня интересует полный список «переменных» (и их типов), содержащихся в классах, которые в C ++ обычно являются защищенными / закрытыми членами.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...