Nima uchun Python sinflari ob'ektni meros qilib oladi?

Sinf deklaratsiyasi object dan meros bo'lishi uchun biron bir sabab bormi?

Men buni amalga oshiradigan kodni topdim va buning sababini topa olmayapman.

class MyClass(object):
    # class code follows...

person tjvr    schedule 25.10.2010    source manba
comment
Bu yangi uslub sinfini yaratadi.   -  person SLaks    schedule 25.10.2010
comment
Bu savolga javob (oddiy bo'lsa-da) topish juda qiyin. Python ob'ektining asosiy sinfi yoki shunga o'xshash narsalarni Google orqali qidirish ob'ektga yo'naltirilgan dasturlash bo'yicha o'quv qo'llanmalari sahifalari va sahifalari bilan birga keladi. Ovoz berilmoqda, chunki bu meni eski va yangi uslubdagi python obyektlarini qidirish so‘zlariga olib borgan birinchi havola.   -  person vastlysuperiorman    schedule 22.12.2015
comment
Bu savol qismini qanday qidirishni bilish uchun SymbolHound - bu variant.   -  person user202729    schedule 31.01.2021


Javoblar (6)


Sinf deklaratsiyasi object dan meros bo'lishi uchun biron bir sabab bormi?

Python 3 da, Python 2 va 3 o'rtasidagi moslikdan tashqari hech qanday sabab. Python 2 da ko'p sabablar.


Python 2.x hikoyasi:

Python 2.x da (2.2 dan boshlab) asosiy sinf sifatida object mavjudligi yoki yo'qligiga qarab ikkita sinf uslubi mavjud:

  1. "klassik" uslub sinflari: ularda asosiy sinf sifatida object mavjud emas:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "yangi" uslub sinflari: ular to'g'ridan-to'g'ri yoki bilvosita (masalan, o'rnatilgan turdagi), object asosiy sinf sifatida:

    >>> class NewSpam(object):           # directly inherit from object
    ...    pass
    >>> NewSpam.__bases__
    (<type 'object'>,)
    >>> class IntSpam(int):              # indirectly inherit from object...
    ...    pass
    >>> IntSpam.__bases__
    (<type 'int'>,) 
    >>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
    (<type 'object'>,)
    

Shubhasiz, dars yozishda siz har doim yangi uslubdagi darslarga borishni xohlaysiz. Buning afzalliklari juda ko'p, ulardan ba'zilarini sanab o'tish mumkin:

Agar siz object dan meros bo'lmasangiz, bularni unuting. Oldingi nuqtalarning batafsil tavsifi va "yangi" uslublar sinflarining boshqa imtiyozlari bilan bu yerda.

Yangi uslubdagi sinflarning kamchiliklaridan biri shundaki, sinfning o'zi ko'proq xotira talab qiladi. Agar siz ko'plab sinf ob'ektlarini yaratmasangiz, bu muammo bo'lishiga shubha qilaman va bu ijobiy narsalar dengizida salbiy cho'kishdir.


Python 3.x hikoyasi:

Python 3 da ishlar soddalashtirilgan. Faqat yangi uslubdagi sinflar mavjud (aniqcha sinflar deb ataladi), shuning uchun object qo'shishdagi yagona farq yana 8 ta belgini kiritishni talab qiladi. Bu:

class ClassicSpam:
    pass

bunga to'liq ekvivalent (ularning nomidan tashqari :-):

class NewSpam(object):
     pass

va bunga:

class Spam():
    pass

Hammaning __bases__ sonida object bor.

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]

Xo'sh, nima qilish kerak?

Python 2 da: har doim object dan aniq meros qilib oling. Imtiyozlarni oling.

Python 3 da: object dan meros bo'lib, agar siz Python agnostik bo'lishga harakat qiladigan kod yozayotgan bo'lsangiz, ya'ni u Python 2 va Python 3 da ishlashi kerak. Aks holda, buni qilmang farq yo'q, chunki Python uni siz uchun sahna ortida joylashtiradi.

person Dimitris Fasarakis Hilliard    schedule 12.07.2017
comment
asosiy sinf sifatida o'rnatilgan turning mavjudligi yoki yo'qligiga qarab =› aslida bu asosiy sinf sifatida o'rnatilgan turning yo'qligi yoki mavjudligi haqida emas, balki sinfning to'g'ridan-to'g'riyoki bilvosita meros qilib olishi haqida emas. - object dan. IIRC shunday vaqt bor ediki, barcha o'rnatilgan turlar hali yangi uslubdagi sinflarga o'tkazilmagan. - person bruno desthuilliers; 19.03.2018
comment
@brunodesthuilliers Mening taassurotim shundaki, barcha o'rnatilgan turlar object dan meros bo'lib qolgan. Menda Python 2.2.3 bor va tezkor tekshiruvdan so'ng men huquqbuzarni topa olmadim, lekin aniqroq bo'lishi uchun javobni keyinroq qayta so'zlab beraman. Agar misol topsangiz qiziq bo'lardi, mening qiziqishim kuchaydi. - person Dimitris Fasarakis Hilliard; 20.03.2018
comment
Rostini aytsam (oldingi sharhimda IIRC ga qarang) men bu fikrga 101% ishonchim komil emas (yangi uslubdagi sinflar kiritilganda barcha o'rnatilgan turlar allaqachon yangi uslubdagi sinflarga aylantirilganmi) - men shunchaki noto'g'ri bo'lishim mumkin, yoki bu faqat ba'zi standart lib turlariga tegishli bo'lishi mumkin (lekin o'rnatilgan emas). Biroq, menimcha, yangi uslubdagi sinfning asoslarida object bo'lganligini aniqlab berish kerak. - person bruno desthuilliers; 20.03.2018
comment
staticmethod va classmethod hatto eski uslubdagi darslarda ham yaxshi ishlaydi. property sorta eski uslubdagi sinflarda o'qish uchun ishlaydi, u shunchaki yozishni to'xtata olmaydi (shuning uchun siz nomga tayinlasangiz, misol xususiyatni soya qiladigan berilgan nomning atributiga ega bo'ladi). Shuni ham yodda tutingki, __slots__ atributiga kirish tezligini yaxshilash asosan yangi uslubdagi sinf atributiga kirish yoʻqotishlarini bartaraf etishga qaratilgan, shuning uchun bu aslida yangi uslubdagi sinflarning savdo nuqtasi emas (xotirani tejash savdo nuqtasidir). - person ShadowRanger; 02.04.2019

Python 3

  • class MyClass(object): = Yangi uslubdagi sinf
  • class MyClass: = Yangi uslubdagi sinf (so'zsiz object dan meros bo'lib oladi)

Python 2

  • class MyClass(object): = Yangi uslubdagi sinf
  • class MyClass: = ESKI TARTIBDAGI SINF

Izoh:

Python 3.x da asosiy sinflarni belgilashda sizga ta'rifdan object ni olib tashlashga ruxsat beriladi. Biroq, bu jiddiy kuzatilishi qiyin muammo uchun eshikni ochishi mumkin ...

Python yangi uslubdagi sinflarni Python 2.2 da joriy qilgan va hozircha eski uslubdagi sinflar haqiqatan ham eski. Eski uslubdagi darslar muhokamasi 2-da ko'milgan. .x docs va 3.x hujjatlarida mavjud emas.

Muammo shundaki,Python 2.x da eski uslubdagi sinflar sintaksisi Python 3.x da yangi uslubdagi sinflar uchun muqobil sintaksis bilan bir xil. Python 2.x hali ham juda keng qo'llaniladi (masalan, GAE, Web2Py) va har qanday kod (yoki koder) 3.x uslubidagi sinf ta'riflarini 2.x kodiga beixtiyor olib keladigan ba'zi jiddiy eskirgan asosiy ob'ektlar bilan yakunlanadi. Va eski uslubdagi darslar hech kimning radarida bo'lmaganligi sababli, ular nima urganini bilishmaydi.

Shunday qilib, uni uzoq yo'l bilan talaffuz qiling va 2.x ishlab chiquvchisini ko'z yoshlarini saqlang.

person Yarin    schedule 25.02.2012
comment
Python 3.x da asosiy sinflarni belgilashda sizga ob'ektni ta'rifdan olib tashlashga ruxsat beriladi. Biroq, bu jiddiy kuzatilishi qiyin bo'lgan muammo uchun eshikni ochishi mumkin... Siz qanday muammolarni nazarda tutyapsiz? - person Aidis; 11.12.2014
comment
@Aidis: Menimcha, ular Py2 va Py3-da ishlaydigan kod Py3-da yaxshi bo'lishini, lekin agar u yangi uslubdagi sinf xususiyatlariga tayansa, Py2-da buzilganligini anglatadi. Shaxsan men shunday kod yozayotgan bo'lsam, aniq merosni qoldirib, modulning yuqori qismiga __metaclass__ = type qo'yaman (from __future__ import absolute_import, division, print_function qatordan keyin :-) ); bu Py2-dagi muvofiqlikni buzish bo'lib, u moduldagi barcha keyinchalik belgilangan sinflarni sukut bo'yicha yangi uslubga aylantiradi va Py3-da u butunlay e'tiborga olinmaydi (faqat tasodifiy global o'zgaruvchi atrofida o'tiribdi), shuning uchun u zararsizdir. - person ShadowRanger; 09.12.2016
comment
Endi Python 2 eskirgan bo'lsa, ularni orbitadan o'chiringmi? - person endolith; 19.09.2020

Ha, bu "yangi uslub" ob'ekti. Bu python2.2 da kiritilgan xususiyat edi.

Yangi uslubdagi ob'ektlar klassik ob'ektlardan farqli ob'ekt modeliga ega va ba'zi narsalar eski uslubdagi ob'ektlar bilan to'g'ri ishlamaydi, masalan, super(), @property va tavsiflovchilar. Qanday yangilik haqida yaxshi ma'lumot olish uchun ushbu maqolaga qarang. uslublar sinfidir.

SO farqlar tavsifi uchun havola: Eski uslub o'rtasidagi farq nima va Python da yangi uslublar darslari?

person Jerub    schedule 25.10.2010
comment
+1 Bu. E'tibor bering, Python 3 da eski uslubdagi sinflar yo'q bo'lib ketgan, shuning uchun siz Python 2 da faqat object dan meros olishingiz kerak. - person ; 25.10.2010
comment
Bu haqiqiy javob emas. Men faqat boshqa maqolalarga havola qilaman. Menimcha, Yarinning javobi bu savolga javob sifatida qabul qilinishi kerak. - person alwbtc; 01.01.2016
comment
@alwbtc: Bu javobda ham yangi narsa bor. Masalan, super() ni eslatish meni boshqa muhim narsaga olib keldi [bu yerda](stackoverflow.com/questions/576169/ ). - person ViFI; 29.06.2016

Python-ni qiyin yo'l bilan o'rganing tarixi:

Python-ning sinfning asl nusxasi ko'p jiddiy yo'llar bilan buzilgan. Bu xato tan olinganda, allaqachon kech edi va ular buni qo'llab-quvvatlashlari kerak edi. Muammoni hal qilish uchun ularga "eski sinflar" ishlashda davom etishi uchun "yangi sinf" uslubi kerak edi, lekin siz yangi, to'g'ri versiyadan foydalanishingiz mumkin.

Ular sinf yaratish uchun siz meros qilib olgan "sinf" bo'lish uchun kichik harflar bilan yozilgan "ob'ekt" so'zidan foydalanishga qaror qilishdi. Bu chalkash, lekin sinf sinf yaratish uchun "ob'ekt" nomli sinfdan meros oladi, lekin bu ob'ekt emas, balki uning sinfi, lekin ob'ektdan meros olishni unutmang.

Bundan tashqari, yangi uslubdagi sinflar va eski uslubdagi sinflar o'rtasidagi farq nima ekanligini bilish uchun, yangi uslubdagi sinflar har doim object sinfdan yoki object dan meros qolgan boshqa sinfdan meros bo'lib qoladi:

class NewStyle(object):
    pass

Yana bir misol:

class AnotherExampleOfNewStyle(NewStyle):
    pass

Eski uslubdagi asosiy sinf quyidagicha ko'rinadi:

class OldStyle():
    pass

Va eski uslubdagi bolalar sinfi quyidagicha ko'rinadi:

class OldStyleSubclass(OldStyle):
    pass

Old Style asosiy klassi boshqa sinflardan meros bo'lmasligini ko'rishingiz mumkin, ammo Old Style sinflari, albatta, bir-biridan meros bo'lishi mumkin. Ob'ektdan meros olish har bir Python sinfida ma'lum funksiyalar mavjudligini kafolatlaydi. Python 2.2 da yangi uslublar sinflari joriy etildi

person disp_name    schedule 04.11.2014
comment
Ildiz sinfini object deb atash unchalik chalkash emas va aslida bu juda standart. Smalltalk Object nomli ildiz sinfiga va Class nomli ildiz metaklassiga ega. Nega? Chunki, Dog itlar uchun sinf bo'lgani kabi, Object ham ob'ektlar uchun, Class esa sinflar uchun sinfdir. Bugungi kunda odamlar foydalanadigan Java, C#, ObjC, Ruby va boshqa sinfga asoslangan OO tillari ildiz sinfiga ega bo'lgan nom sifatida faqat Python emas, balki Object ning ba'zi bir o'zgarishini ishlatadi. - person abarnert; 04.05.2015

Ha, bu tarixiy. Usiz u eski uslubdagi sinfni yaratadi.

Agar siz eski uslubdagi ob'ektda type() dan foydalansangiz, siz shunchaki "misol" olasiz. Yangi uslubdagi ob'ektda siz uning sinfini olasiz.

person knitti    schedule 25.10.2010
comment
Bundan tashqari, agar siz eski uslubdagi sinfda type() dan foydalansangiz, siz turi o'rniga classobj olasiz. - person Joel Sjögren; 15.02.2014

Sinf yaratish bayonotining sintaksisi:

class <ClassName>(superclass):
    #code follows

Agar siz meros qilib olmoqchi bo'lgan boshqa supersinflar bo'lmasa, superclass har doim Python'dagi barcha sinflarning ildizi bo'lgan object bo'lishi kerak.

object texnik jihatdan Python tilidagi "yangi uslubdagi" sinflarning ildizidir. Ammo bugungi kunda yangi uslubdagi darslar yagona uslub sifatida yaxshi.

Ammo, agar siz sinflarni yaratishda object so'zidan aniq foydalanmasangiz, boshqalar ta'kidlaganidek, Python 3.x bilvosita object superklassidan meros bo'lib qoladi. Ammo menimcha, ochiq-oydin har doim yashirin (do'zax)dan yaxshiroqdir

Ma'lumotnoma

person kmario23    schedule 20.10.2016