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...
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...
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 da (2.2 dan boshlab) asosiy sinf sifatida object
mavjudligi yoki yo'qligiga qarab ikkita sinf uslubi mavjud:
"klassik" uslub sinflari: ularda asosiy sinf sifatida object
mavjud emas:
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()
"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:
Deskriptorlar uchun yordam. Xususan, quyidagi konstruksiyalar deskriptorlar yordamida amalga oshiriladi:
classmethod
: A method that receives the class as an implicit argument instead of the instance.staticmethod
: self
yashirin argumentini birinchi marta qabul qilmaydigan usul dalil.property
bilan xususiyatlar: olish, sozlash va o‘chirishni boshqarish uchun funksiyalar yarating. atribut.__slots__
: sinfning xotira sarfini tejaydi va atributlarga tezroq kirish imkonini beradi. . Albatta, u cheklovlar kiritadi.__new__
statik usul: yangi sinf misollarini sozlash imkonini beradi. yaratilgan.
Usulni hal qilish tartibi (MRO): sinfning asosiy sinflari qanday tartibda qaysi usulni chaqirish kerakligini hal qilishga urinayotganda qidiriladi.
MRO bilan bog'liq, super
ta qo'ng'iroq. Shuningdek qarang: super()
super deb hisoblanadi.
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 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]
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.
object
dan. IIRC shunday vaqt bor ediki, barcha o'rnatilgan turlar hali yangi uslubdagi sinflarga o'tkazilmagan.
- person bruno desthuilliers; 19.03.2018
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
object
bo'lganligini aniqlab berish kerak.
- person bruno desthuilliers; 20.03.2018
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 sinfclass MyClass:
= Yangi uslubdagi sinf (so'zsiz object
dan meros bo'lib oladi)Python 2
class MyClass(object):
= Yangi uslubdagi sinfclass MyClass:
= ESKI TARTIBDAGI SINFIzoh:
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.
__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
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?
object
dan meros olishingiz kerak.
- person ; 25.10.2010
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
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.
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