dir
- встроенная функция. Вы пытаетесь присоединить эту функцию к строке 'index.html'
, отсюда и ошибка.
Причина, по которой вы, вероятно, смущены, заключается в том, что вы пытались скрыть dir
со строкой, здесь:
dir = path.abspath(path.dirname(__file__))
Но когда вы помещаете это в определение class
, это не создает глобальную переменную, которая скрывает встроенную функцию, она создает атрибут класса. Чтобы получить доступ к атрибуту класса из метода этого класса, вы должны сделать то же самое, что и с обычным атрибутом экземпляра:
content_path = path.join(self.dir, 'index.html')
Единственные различия между атрибутами класса и атрибутами экземпляра заключаются в том, что:
- Все ваши экземпляры имеют один и тот же атрибут
dir
вместо того, чтобы каждый имел свою собственную копию.
- Вы можете получить к нему доступ как
RequestHandler.dir
или type(self).dir
вместо self.dir
.
Чтобы избежать такого рода путаницы, рекомендуется избегать повторного использования имен любых встроенных функций. Хотя это законно , это часто приводит к ошибкам, подобным этой, и усложняет отладку этих ошибок.
Кроме того, учитывая, что dir
является константой во всей программе, точно так же, как hostName
и hostPort
, и не все это тесно связано с типом RequestHandler
, возможно, вы просто хотели глобальный константа, например hostName
, вместо атрибута класса.