“Birinci sınıf” nesneler nelerdir?


192

Belirli bir programlama dilinde nesneler veya başka bir şey ne zaman "birinci sınıf" olarak söylenir ve neden? Bulunmadıkları dillerden farkı nedir?

DÜZENLE. Kişi "her şey bir nesnedir" derken (Python'da olduğu gibi), gerçekten de "her şey birinci sınıftır" mı demektir?


1
Bu soruyu programcılara taşımak mümkün müdür? Yoksa orada da uyumsuz mu olur? Bence bu soru iyi. Hangi forumun ona en uygun olacağını söyleyemem.
Shashank Sawant

Yanıtlar:


177

Kısacası, nesnenin kullanımında herhangi bir kısıtlama olmadığı anlamına gelir. Diğer nesnelerle aynı.

Birinci sınıf bir nesne, dinamik olarak oluşturulabilen, yok edilebilen, bir işleve geçirilebilen, değer olarak döndürülebilen ve programlama dilindeki diğer değişkenlerin sahip olduğu tüm haklara sahip olan bir varlıktır.

Dile bağlı olarak bu şu anlama gelebilir:

  • anonim değişmez değer olarak ifade edilebilir olma
  • değişkenlerde depolanabilir olmak
  • veri yapılarında depolanabilir olma
  • gerçek bir kimliğe sahip olmak (herhangi bir addan bağımsız olarak)
  • diğer varlıklarla eşitlikle karşılaştırılabilir olma
  • bir prosedüre / işleve parametre olarak geçilebilir olma
  • bir prosedür / fonksiyon sonucunda iade edilebilir olma
  • çalışma zamanında inşa edilebilir olmak
  • yazdırılabilir olmak
  • okunabilir olmak
  • dağıtılmış süreçler arasında aktarılabilir olmak
  • çalışan süreçlerin dışında depolanabilir olmak

Kaynak .

Ancak C ++ işlevlerinde kendileri birinci sınıf nesneler değildir:

  • '()' Operatörünü geçersiz kılarak birinci sınıf olan bir nesne fonksiyonuna sahip olursunuz.
  • Fonksiyon göstergeleri birinci sınıftır.
  • boost bind, lambda ve function birinci sınıf fonksiyonlar sunuyor

C ++ 'da, sınıflar birinci sınıf nesneleri değildir, ancak bu sınıfların örnekleridir. Python'da hem sınıflar hem de nesneler birinci sınıf nesnelerdir. ( Nesne olarak sınıflar hakkında daha fazla bilgi için bu cevaba bakınız ).

Javascript birinci sınıf işlevlerine bir örnek:

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

Kaynak .

Birinci sınıf nesne olmayan varlıklara ikinci sınıf nesne denir. Dinamik olarak oluşturulamadığından, C ++ işlevler ikinci sınıftır.

Düzenleme ile ilgili:

DÜZENLE. Kişi "her şey bir nesnedir" derken (Python'da olduğu gibi), gerçekten de "her şey birinci sınıftır" mı demektir?

Nesne terimi gevşek bir şekilde kullanılabilir ve birinci sınıf olduğu anlamına gelmez. Ve tüm konsepte 'birinci sınıf varlıklar' demek muhtemelen daha mantıklı olacaktır. Ama Python'da her şeyi birinci sınıf haline getirmeyi amaçlıyorlar. İfadenizi yapan kişinin amacının birinci sınıf anlamına geldiğine inanıyorum.


2
'Birinci sınıf' olmayan nesnelerden bazı örnekler verebilir misiniz?
Sudip Bhandari

1
@SudipBhandari Aynı şeyi merak ettim, sonunda bu konuyla ilgili faydalı Wikipedia makalesine rastladım: birinci sınıf vatandaş / nesne . Robin Popplestone'un tanımını özellikle yararlı buldum. (Btw, bir WP makalesi yayınlamak çok açık görünebilir, ancak bunun temel bir programlama dili konsepti olduğunu fark etmedim)
mblakesley

19

"Kişi" her şey bir nesne "dediğinde (Python'da olduğu gibi), gerçekten de" her şey birinci sınıf "anlamına mı geliyor?"

Evet.

Python'daki her şey uygun bir nesnedir. Diğer dillerde "ilkel tip" olan şeyler bile.

Gibi bir nesnenin 2aslında oldukça zengin ve sofistike bir arayüze sahip olduğunu görüyorsunuz.

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

Her şey Python'da birinci sınıf bir nesne olduğundan, göreceli olarak az sayıda özel durum vardır.

Örneğin Java'da, uygun nesne olmayan ilkel türler (int, bool, double, char) vardır. Bu nedenle Java'nın birinci sınıf tür olarak Integer, Boolean, Double ve Character'i tanıtması gerekir. Bu yeni başlayanlara öğretmek zor olabilir - hem ilkel bir tipin hem de bir sınıfın neden yan yana var olması gerektiği açık değildir.

Ayrıca bir nesnenin sınıfının - kendisinin - bir nesne olduğu anlamına gelir. Bu, sınıfların çalışma zamanında her zaman farklı bir varlığı olmayan C ++ 'dan farklıdır.

Türü 2olan type 'int'yöntemler, özellikler ve bir tür olduğu nesne.

>>> type(2)
<class 'int'>

Tipi yerleşik bir türü gibi intolan type 'type'nesne. Bunun da yöntemleri ve nitelikleri vardır.

>>> type(type(2))
<class 'type'>

1
Bu modern Python için geçerlidir. Eski Python'da (sürüm 1? Benim zamanımdan önceydi) miras alamadınız int. Böylece "eski" karşısında "yeni stil sınıfları" (ve 3'te artık eski stil sınıfları yoktur).
Keith Pinson

17

“Birinci sınıf”, normal şekilde çalışabileceğiniz anlamına gelir. Çoğu zaman, bu sadece bu birinci sınıf vatandaşları işlevlere argüman olarak aktarabileceğiniz veya işlevlerden iade edebileceğiniz anlamına gelir.

Bu, nesneler için açıktır, ancak işlevler ve hatta sınıflar için her zaman belirgin değildir:

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

Bu, işlevlerin gerçekte birinci sınıf nesneler olmadığı bir C # örneğidir . Bu nedenle yukarıdaki kod, Action<>bir işlevi bağımsız değişken olarak iletmek için küçük bir geçici çözüm (yani genel bir delege ) kullanır. Ruby gibi diğer diller, sınıfların ve kod bloklarının bile normal değişkenler olarak (veya Ruby durumunda sabitler) ele alınmasına izin verir.



1

IMO bu, doğal dilde bir şeyleri tanımlamak için kullanılan metaforlardan biridir. Terim, temel olarak, fonksiyonları birinci sınıf nesneler olarak tanımlama bağlamında kullanılır.

Nesneye yönelik bir dil düşünürseniz, nesnelere çeşitli özellikler verebiliriz: miras, sınıf tanımı, kodun diğer bölümlerine geçme yeteneği (yöntem bağımsız değişkenleri), bir veri yapısında saklama yeteneği vb. java komut dosyasındaki işlevler gibi, normalde nesne olarak kabul edilmeyen bir varlık için olduğu gibi, bu varlıklar da birinci sınıf nesneler olarak kabul edilir.

Burada birinci sınıf, ikinci sınıf olarak ele alınmayan (bozulmuş davranışlarla) anlamına gelir. Temelde alay mükemmel veya ayırt edilemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.