Sadece python sınıfları belgelerini okuyordum, diyor, python'da "sınıflar kendilerini nesnedir" .Nasıl C# veya Java sınıflarından farklıdır? Bu tür sınıfların C# veya Java ile karşılaştırdığı avantaj ve dezavantajlar nelerdir?Sınıflar tarafından kastedilen nesnelerin nesnesidir?
cevap
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.
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
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 :)
+1 :) – zeekay
statically –
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.
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.
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.
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. İştenew
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.
- 1. SWIG tarafından oluşturulan nesnelerin bellek yönetimi C
- 2. Bir Java programı tarafından hangi sınıflar kullanılır?
- 3. Çoklu Sınıflar tarafından uygulanan Arabirim Bağımlılık Enjeksiyonu
- 4. nesnelerin
- 5. nesnelerin
- 6. çoklu sınıflar?
- 7. sola en türetme ile kastedilen nedir?
- 8. İki ayaklı kimlik doğrulamasıyla kastedilen nedir?
- 9. Ruby'de nesneler (sınıflar) tarafından yapılmış bir nesne (sınıf) nasıl oluşturulur?
- 10. Proguard, tüm başvurulan sınıflar
- 11. DDD: Bağlantı nesneleri Varlık Nesnesi veya Değer Nesnesidir?
- 12. Özet Mühürlü Sınıflar
- 13. Sınıflar ve alt sınıflar için yazdırma
- 14. Nesnelerin Karşılaştırılabilir
- 15. Nesnelerin sonraki sayfasına geçme
- 16. Tanımsız sınıflar
- 17. Java - Jenerik Sınıflar
- 18. Farklı nesnelerin kilidinin okunması
- 19. Javascript Yazılan Nesnelerin Serileştirilmesi
- 20. Nesnelerin bir listesini Java'daki isteğe bağlı nesnelerin listesine dönüştürme
- 21. Nesnelerin javascript dizisini eşleme yöntemini kullanarak diğer nesnelerin dizisine dönüştürülmesi
- 22. Nesnelerin bir listesini yazdırma
- 23. javascript'te nesnelerin kartezyen çarpımı
- 24. Nesnelerin uygun kullanımı
- 25. Özel nesnelerin filtrelenmesi
- 26. Genel nesnelerin genel listesi
- 27. Eski kuşaktaki nesnelerin istatistikleri?
- 28. Java 8 akışı nesnelerin
- 29. Nesnelerin bir dizisini javascript
- 30. Katıştırılmış nesnelerin listesi isteme
Java'da, şu şekilde bir sınıfın yeni örneklerini oluşturun: Object o = C.newInstance(); Mükemmel bağlantı için – stacker