Автор оригинала: Mike Driscoll.
Сегодня один из моих коллег пришел и получил меня так, чтобы я мог объяснить какой-то странный код Python, который они нашли. Он имел дело с Cmake, но так как он был внутренним кодом, я не смогу показать это здесь. Вместо этого я написал что-то, что имеет те же проблемы, чтобы вы могли видеть, что я считаю плохой, или по крайней мере, очень тупой код:
class Config: def Run(self): print('Program Usage: blah blah blah') print(self.product) self.asset_tag = 'test' print(self.asset_tag) total = self.sub_total_a + self.sub_total_b
Когда я впервые увидел это, я был поражен тем, как он использовал атрибуты, которые не были инициализированы, и я задавался вопросом, как это могло работать. Тогда я понял, что они должны делать какую-то паттер обезьяны. Патчевка обезьян – это то, где вы пишете код для динамического изменения класса или модуля во время выполнения. Поэтому я посмотрел на скрипте и нашел какой-то код, который создал экземпляр класса и сделал что-то подобное:
def test_config(): cfg = Config() cfg.product = 'laptop' cfg.asset_tag = '12345ABCD' cfg.sub_total_a = 10.23 cfg.sub_total_b = 112.63 cfg.Run() if __name__ == '__main__': test_config()
Таким образом, всякий раз, когда вы создаете экземпляр класса, вам нужно исправить его, чтобы атрибуты были до того, как вы позвоните Беги метод.
Хотя я думаю, что это довольно круто, что Python может сделать такую вещь, это чрезвычайно запутанному кому-то, кто не знаком с Python, особенно когда код был таким же плохо документирован, как это было. Как видите, комментариев нет или доклады нет, поэтому потребовалось немного копаться, чтобы выяснить, что происходит. К счастью, весь код был в том же файле. В противном случае это могло быть очень сложно выяснить.
Я лично подумал, что это хороший пример плохого кодирования. Если бы я написал это, я бы создал бы __init__ Способ и инициализированные все эти атрибуты там. Тогда не было бы путаницы о том, как работал класс. Я также большой верующий в написании хороших Docstrings и полезных комментариев.
Во всяком случае, я надеюсь, что вы нашли это интересно. Я также думал, что мои читатели должны знать о некоторых из кусочков кадчей кода, которые вы увидите в дикой природе.