Клас з об'єктом як параметр


114

Я намагаюся перевести якийсь код python у код scala. Тож я тотальний ноб у Python.

Але чому деякі класи мають об'єкт як параметр, але ніколи не використовують його прямо? Яке міркування для того, щоб мати його як параметр в першу чергу?

Приклад:

class Table(object)

Спасибі за ваш час.


Відповіді:


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__']

Також властивості та супер не працюють з класичними класами.

У Python2 - гарна ідея зробити усі класи класами нового типу. (Хоча велика кількість класів у стандартній бібліотеці все ще є класичними класами, задля сумісності із зворотним процесом.)

Загалом у заяві типу

class Foo(Base1, Base2):

Fooоголошується як клас, що успадковується від базових класів Base1і Base2.

objectє матір'ю всіх класів в Python. Це клас нового стилю, тому успадкування від objectробить Tableклас нового стилю.


чи можете ви перенаправити мене на джерело, яке згадує об'єкт не потрібно як параметр у Python3? Я не можу його знайти. Дякую
сніг

1
Це багато разів згадувалося в StackOverflow (наприклад, тут ), але мені не вдалося знайти просту заяву про це в документах. Він відображається неявно (упущення objectзі списку баз класів) у підручнику .
unutbu

1
Документи Python3 також заявляють, що "клас нового стилю" - це "стара назва аромату класів, який зараз використовується для всіх об'єктів класу " (мій акцент). І в документах Python2 зазначено, що "клас нового стилю" - це будь-який клас, який успадковує object. Два твердження, зібрані разом, означають, що вам не потрібно включати objectв список баз класів на Python3, оскільки всі класи є класами нового стилю в Python3.
unutbu

21

TableКлас розширює клас з ім'ям object. Це не аргумент. Причина, з якої ви можете objectчітко розширити, - це перетворення класу в клас нового стилю. Якщо ви чітко не вказуєте, що він поширюється object, до Python 3, він за замовчуванням буде класом старого стилю. (Починаючи з Python 3, усі класи є новим стилем, незалежно від того, розширюєте ви явно objectчи ні.)

Для отримання додаткової інформації про класи нового та старого стилю, будь ласка, дивіться це запитання .


1
Це більш простий і короткий відповідь. Дякую.
Сабунку

3

Лише зауважте, що відмінність класу «новий стиль» від «старого стилю» характерна для Python 2.x; у 3.x всі класи - «новий стиль».


2

Таблиця класів та таблиця класів (об'єкт) не відрізняються для Python.

Це не параметр, він поширюється на об'єкт (який є базовим класом, як і багато інших мов).

Все, що вона говорить, це те, що він успадковує все, що визначено в "об'єкті". Це поведінка за замовчуванням.


3
Класи, що автоматично розширюються, objectє поведінкою за замовчуванням лише в Python 3. У python 2 об’єкт, що розширює клас, має атрибути, яких клас, який не розширює об'єкт, не матиме.
Льюїс Елліс

1

об'єкт - це самий базовий тип об'єкта класу, визначений в python. Атрибути об’єкта можна побачити, як показано нижче

** >>> реж (об’єкт)

[' клас ', ' delattr ', ' документ ', ' формат ', ' GetAttribute ', ' хеш ', ' ініціалізації ', ' новий ', ' зменшити ', ' reduce_ex ', ' Repr ', ' SetAttr ', ' sizeof ',' str ',' subclasshook '] **

Тож Таблиця (об’єкт) - це просто спадщина!


0

1) Назва класу (об’єкт): 2) назва класу: вони обидва однакові, але перший досить кращий з точки зору написання, він краще виглядає, успадковуючи інші класи іншим, виглядає однорідним.

Як же? Отже, кожна річ в Python потрапляє під об'єкт означає, що кожна річ в Python має властивість об'єкта, якщо написати чи ні, вона зрозуміє це. По-перше, ми прямо говоримо це, вдруге ми цього не зробили.


Це не так у Python 2, див. Прийняту відповідь для деталей.
niemmi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.