Это ответ на несколько иной вопрос, но поскольку я сам застрял в этом, я надеюсь, что это может быть полезно для кого-то другого.
Если вы хотите использовать allow_redirects=False
и перейти непосредственно к сначала перенаправляйте объект, а не следуя цепочке из них, и вы просто хотите получить место перенаправления непосредственно из объекта ответа 302, тогда r.url
не будет работать. Вместо этого это заголовок «Местоположение»:
r = requests.get('http://github.com/', allow_redirects=False)
r.status_code # 302
r.url # http://github.com, not https.
r.headers['Location'] # https://github.com/ -- the redirect destination
Что касается методов расширения C #: Не напрямую. C ++ в этих вещах меньше нуждается, потому что C ++ поддерживает бесплатные функции. Я никогда не использовал Objective-C, поэтому не могу здесь комментировать.
C ++ не имеет закрытых классов или наследования одного класса, поэтому в большинстве случаев вы можете создать подкласс базового класса. Есть творческие способы сделать класс ненаследуемым, но их немного, и они далеко друг от друга. В общем, у C ++ нет проблем, которые есть у C #, которые породили методы расширения.
C не является объектно-ориентированным, поэтому вопрос на самом деле не актуален.
Не совсем. Это не способ обращения с классами в C ++.
Среди прочего, Мейерс утверждает, что лучше всего иметь небольшой класс с минимальным набором операций, которые делают его полностью полезным. Если вы хотите расширить набор функций, вы можете добавить пространство имен служебной программы (например, пространство имен ClassUtil), которое содержит служебные функции, не являющиеся членами, которые работают с этим минимальным классом. Добавлять функции в пространство имен легко из любого места.
Вы можете проверить обсуждение темы здесь .
Можете ли вы использовать интерфейс? Методы расширения - это простой способ избежать подклассификации, но они становятся полубесполезными при использовании правильных методов ОО. Причина, по которой они так часто используются в Linq, заключается в том, что команде VS не пришлось обновлять код, который, скорее всего, сломал бы множество старых приложений.
Согласно MSDN: "В общем, мы рекомендуем применять методы расширения редко и только тогда, когда это необходимо. По возможности, клиентский код, который должен расширять существующий тип, должен делать это путем создания нового типа, производного от существующего типа."