Я обнаружил, что работают оба следующих варианта:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
Должны ли все классы Python расширять объект? Есть ли потенциальные проблемы с невыдвижением объекта?
python
inheritance
Кара
источник
источник
class Foo():
иclass Foo:
? Насколько я понимаю, оба работают на Python 3.Ответы:
В Python 2 отказ от наследования от
object
создаст класс в старом стиле, который, помимо других эффектов,type
дает разные результаты:против
Кроме того, правила множественного наследования отличаются друг от друга, и я даже не буду пытаться здесь резюмировать. Вся хорошая документация по MI, которую я видел, описывает классы нового стиля.
Наконец, классы старого стиля исчезли в Python 3, и наследование от
object
стало неявным. Поэтому всегда отдавайте предпочтение новым классам стилей, если вам не нужна обратная совместимость со старым программным обеспечением.источник
В Python 3 классы расширяются
object
неявно, независимо от того, говорите вы об этом или нет.В Python 2 есть классы старого и нового стиля . Чтобы указать, что класс является новым стилем, вы должны явно наследовать от
object
. В противном случае используется реализация в старом стиле.Обычно вам нужен класс нового стиля.
object
Явное наследование от . Обратите внимание, что это также относится к коду Python 3, который стремится быть совместимым с Python 2.источник
В python 3 вы можете создать класс тремя разными способами, и внутренне они все равны (см. Примеры). Неважно, как вы создаете класс, все классы в Python 3 наследуются от специального класса, называемого объектом . Класс объект является фундаментальным классом в Python и предоставляет много функциональных возможности, как методы двойного подчеркивания, дескрипторы, супер метод (метод), свойство () и т.д.
Пример 1.
Пример 2.
Пример 3.
источник
object
это ссылка на встроенныйobject
. Если мы должны принять во внимание, что любой встроенный идентификатор CPython может быть заменен, мы едва ли сможем сделать какое-то утверждение о модели данных. Можно ли всерьез возразить, чтоstr
не всегда строка является аргументом, потому что ее можно присвоитьbuiltins.str = None
?Да, все классы Python должны расширять (или, скорее, подкласс, здесь Python) объект. Хотя обычно серьезных проблем не возникает, в некоторых случаях (например, с множественными деревьями наследования) это будет важно. Это также обеспечивает лучшую совместимость с Python 3.
источник
Как уже говорилось в других ответах, наследование Python 3 от объекта является неявным. Но они не говорят, что вам следует делать и что является условностью.
Все примеры документации Python 3 используют следующий стиль, который является соглашением, поэтому я предлагаю вам следовать ему для любого будущего кода на Python 3.
Источник: https://docs.python.org/3/tutorial/classes.html#class-objects
Пример цитаты:
Еще одна цитата:
источник
в python3 нет различий, но в python2 без расширения
object
вы получаете классы в старом стиле; вы хотите использовать класс нового стиля вместо класса старого стиля.источник