2011-06-26 18 views

cevap

1

Asıl fark, sınıfı bir nesne olarak kolayca değiştirebileceğiniz anlamına gelmeleridir. Aynı özellik, bir nesnenin sınıfı hakkında bilgi almak için Class yöntemlerini kullanabileceğiniz Java'da kullanılabilir. Python, Ruby ve Smalltalk gibi dillerde, dilin daha dinamik doğası, sınıfı “açmanıza” ve bazen “maymun yama” olarak adlandırılan değiştirmenize izin verir. Şahsen ben farklılıklar çok büyük bir şey olduğunu düşünmüyorum ama eminim ki bu konuda iyi bir din savaşı başlatabiliriz.

8

Python'da, sınıflar, onları diğer değişkenler gibi değişkenlere atayabileceğiniz, işlevlere vb. Iletebileceğiniz anlamda nesnelerdir. Örneğin

>>> t = type(10) 
>>> t 
<type 'int'> 
>>> len(t.__dict__) 
55 
>>> t() # construct an int 
0 
>>> t(10) 
10 

Java bir sınıf ile ilgili bazı bilgiler sağlar Class nesneler vardır, ancak açık bir sınıf adları yerine bunları kullanamaz. Onlar gerçekten sınıflar değil, sadece sınıf bilgi yapıları.

Class C = x.getClass(); 
new C(); // won't work 
+0

Java'da, şu şekilde bir sınıfın yeni örneklerini oluşturun: Object o = C.newInstance(); Mükemmel bağlantı için – stacker

2

C# ve Java'da sınıflar nesne değildir. Bu diller, statik olarak yazılan anlamındadır. Doğru, belirli bir sınıfı temsil eden bir nesneyi alabilirsiniz - ama bu sınıfın kendisi ile aynı değil.

Pitonda bir sınıfa benzeyen şey aslında bir nesnedir.

Bu şimdiye kadar bir sınıf sadece değişkenin bildirilmesi oluşturur bildirme :)

+0

+1 :) – zeekay

+1

statically –

3

yapabilirsiniz çok daha iyi here exlpained oluyor:

class foo(object): 
    def bar(self): pass 
print foo # <class '__main__.foo'> 

Onlar atanan ve herhangi bir değişken gibi saklanabilir:

class foo(object): 
    pass 
class bar(object): 
    pass 
baz = bar # simple variable assignment 
items = [foo, bar] 
my_foo = items[0]() # creates a foo 
for x in (foo, bar): # create one of each type 
    print x() 

ve değişken olarak geçirilen:

class foo(object): 
    def __init__(self): 
     print "created foo" 
def func(f): 
    f() 

func(foo) 

Onlar taban sınıfı listesi de dahil olmak fonksiyonları tarafından oluşturulabilir: Buna

def func(base_class, var): 
    class cls(base_class): 
     def g(self): 
      print var 
    return cls 

class my_base(object): 
    def f(self): print "hello" 

new_class = func(my_base, 10) 
obj = new_class() 
obj.f() # hello 
obj.g() # 10 

, Java sınıfları örneğin onları temsil nesneleri varken. String.class, sınıfın adı - String - bir nesne değildir ve tek olarak değiştirilemez. Statik olarak yazılan dillerin doğasında var.

1

Sınıflar, herhangi bir nesne gibi Python kodunda işlenebilecekleri nesnelerdir. Diğerleri, onları herhangi bir nesne gibi çalıştırılmalarına izin vererek, işlevlere nasıl iletebileceğinizi gösterdiler. İşte bunu nasıl geçerli:

class Foo(object): 
    pass 

f = Foo() 

f.a = "a" # assigns attribute on instance f 
Foo.b = "b" # assigns attribute on class Foo, and thus on all instances including f 

print f.a, f.b 

İkincisi, bütün nesneler gibi sınıflar çalışma zamanında örneği. Yani, bir sınıf tanımı, yerine çalıştırılan bir kod, hiçbir şey çalıştırılmadan önce derlenmiş bir yapıdır.Bu, bir sınıfın yalnızca program çalıştırıldığında, örneğin ortam değişkenleri veya kullanıcı girişi gibi bilinen şeyleri "pişirebildiği" anlamına gelir. Bunlar, sınıf ilan edildiğinde bir kez değerlendirilir ve sonra sınıfın bir parçası haline gelir. Bu, farklı şekilde uygulanacak olan bu tür davranışları gerektiren C# gibi derlenmiş dillerden farklıdır.

Son olarak, sınıflar, herhangi bir nesne gibi, sınıflardan oluşturulur. Bir nesne bir sınıftan inşa edildiği gibi, meta sınıfı olarak adlandırılan özel bir sınıftan yapılmış bir sınıftır. Sınıfların nasıl tanımlandığını değiştirmek için kendi meta sınıflarınızı yazabilirsiniz.

1

sınıfları nesneleri bir diğer avantaj ise nesneleri zamanında sınıfını değiştirebilir olmasıdır:

>>> class MyClass(object): 
...  def foo(self): 
...   print "Yo There! I'm a MyCLass-Object!" 
... 
>>> class YourClass(object): 
...  def foo(self): 
...   print "Guess what?! I'm a YourClass-Object!" 
... 
>>> o = MyClass() 
>>> o.foo() 
Yo There! I'm a MyCLass-Object! 
>>> o.__class__ = YourClass 
>>> o.foo() 
Guess what?! I'm a YourClass-Object! 

Nesneler bir örneği olan sınıfına işaret eden bir özel nitelik __class__ sahiptir. Bu sadece sınıflar kendilerini nesneler oldukları ve bu nedenle __class__ gibi bir özniteliğe bağlı olabileceği için mümkündür.

1

Bu sorunun bir Smalltalk etiketi olduğundan, bu yanıt Smalltalk perspektifinden alınmıştır. Nesne Tabanlı programlamada, mesajlar iletilirken işler yapılır. Bir nesneye mesaj gönderirseniz, nesne bu mesajı anlarsa, ilgili yöntemi uygular ve bir değer döndürür. Ama nesne ilk etapta nasıl yaratılıyor? İleti aktarımına dayanan basit sözdizimini kesecek nesneler oluşturmak için özel sözdizimi eklendi. Bu Java gibi dillerde olur:

p = new Point(10, 20); // Creates a new Point object with the help of a special keyword - new. 
p.draw(); // Sends the message `draw` to the Point object. 

Yukarıdaki kod açıkça görüleceği gibi

, dil iki halletmek için yollar var - zorunlu bir ve Odaklı diğer Nesne. İşte new

p := Point new: 10 y: 20. 
p draw. 

bir tekil nesneye göndermek bir Metaclass bir örneğini olduğunu Point adında bir mesajdır: Buna karşılık, Smalltalk sadece mesajlaşma dayalı tutarlı bir sözdizimi vardır. Dili tutarlı bir hesaplama modeli oluşturmanın yanı sıra, metasınıflar da sınıfların dinamik modifikasyonuna izin verir. Örneğin, aşağıdaki deyim bir recompilation veya VM yeniden başlatma gerektirmeden Point sınıfa yeni bir örnek değişkeni katacak:

Point addInstVarName: 'z'. 

bu konuda en iyi okuma The Art of the Metaobject Protocol olduğunu.