Класс с объектом в качестве параметра

114

Я пытаюсь перевести код Python в код Scala. Так что я полный новичок в Python.

Но почему некоторые классы имеют объект в качестве параметра, но никогда не используют его явно? Какова причина использования этого параметра в первую очередь?

Пример:

class Table(object)

Спасибо за уделенное время.

мифический программист
источник
1
возможный дубликат классов старого и нового стиля в Python
JBernardo

Ответы:

112

В python2 это декларирует Tableбыть классом нового стиля (в отличие от «классического» класса). В Python3 все классы являются классами нового стиля, поэтому в этом больше нет необходимости.

Классы нового стиля имеют несколько особых атрибутов, которых не хватает классическим классам.

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Также свойства и super не работают с классическими классами.

В Python2 рекомендуется сделать все классы классами нового стиля. (Хотя многие классы в стандартной библиотеке по-прежнему являются классическими для обеспечения обратной совместимости.)

В общем, в таком заявлении, как

class Foo(Base1, Base2):

Fooобъявляется как класс, унаследованный от базовых классов Base1и Base2.

objectэто мать всех классов в Python. Это класс нового стиля, поэтому наследование от objectсоздает Tableкласс нового стиля.

unutbu
источник
Можете ли вы перенаправить меня на источник, в котором упоминается, что объект не является необходимым параметром в Python3? Кажется, я не могу его найти. Спасибо
Snow
1
Об этом много раз упоминалось в StackOverflow ( например, здесь ), но мне не удалось найти простого объявления этого в документации. Это показано неявно (путем исключения objectиз списка баз классов) в учебнике .
unutbu 06
1
В документации Python3 также говорится, что «класс нового стиля» - это «старое название разновидности классов, которые теперь используются для всех объектов класса » (выделено мной). А в документации Python2 указано, что «класс нового стиля» - это любой класс, наследующий от object. Эти два оператора вместе означают, что вам не нужно включать objectв список баз классов в Python3, поскольку все классы являются классами нового стиля в Python3.
unutbu 06
21

TableКласс расширяет класс с именем object. Это не аргумент. Причина, по которой вы можете захотеть расширить objectявно, заключается в том, что он превращает класс в класс нового стиля. Если вы явно не укажете, что он расширяется objectдо Python 3, он по умолчанию будет классом старого стиля. (Начиная с Python 3, все классы относятся к новому стилю, независимо от того, расширяете вы явно objectили нет.)

Для получения дополнительной информации о классах нового и старого стиля см. Этот вопрос .

icktoofay
источник
1
Это более простой и лаконичный ответ. Спасибо.
Sabuncu
3

Просто обратите внимание, что различие классов «новый стиль» и «старый стиль» характерно для Python 2.x, в 3.x все классы относятся к «новому стилю».

Лоуренс Д'Оливейро
источник
2

Таблица классов и Таблица классов (объект) ничем не отличаются для Python.

Это не параметр, он происходит от объекта (который является базовым классом, как и многие другие языки).

Все, что он говорит, это то, что он наследует все, что определено в «объекте». Это поведение по умолчанию.

Деврадж
источник
3
Автоматическое расширение классов objectявляется поведением по умолчанию только в Python 3. В python 2 объект, расширяющий класс, имеет атрибуты, которых не будет у класса, не расширяющего объект.
Льюис Эллис
1

объект - это самый базовый тип объекта класса, определенный в python. Атрибуты объекта можно увидеть ниже

** >>> dir (объект)

[' class ', ' delattr ', ' doc ', ' format ', ' getattribute ', ' hash ', ' init ', ' new ', ' reduce ', ' reduce_ex ', ' repr ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

Итак, Table (объект) - это просто наследование.!

Анилкумар Маллакканавар
источник
0

1) Имя класса (объект): 2) Имя класса: они оба одинаковы, но первый лучше с точки зрения написания, он выглядит лучше при наследовании других классов другому, выглядит однородным.

Как же? Итак, каждая вещь в Python относится к объекту, что означает, что каждая вещь в Python имеет свойство объекта, если писать или нет, он это поймет. Во первых мы явно говорим об этом, а во вторых - нет.


источник
В Python 2 это не так, подробности см. В принятом ответе.
Ниемми 06