2012-03-09 13 views
6

Bu benim anlayışım,herherdeğeri object türetilen bir tür olduğundan. Ancak, bu belgelerde bunun kesin onayını bulamıyorum. isinstance(anything, object)'un her zaman True olması gerektiği anlamına gelse de, Python 2 kod tabanında eski kenar durumları olduğunu da hayal edebiliyorum. isinstance(value, object)'un numaralıTrue numaralı bir örneğini bilen biri var mı?Python'da isinstance (value, object) değerinin True olmadığı herhangi bir değer var mı?

Bağlam: Ben tasarlıyorum bir tür hiyerarşi kapsamında, ben isinstance(obj, Alpha) hep True dönmek istediğiniz bir all-encompasing Alpha tipi var. Ben Python 2.6 + ABCMeta.register(object) hile yapmak gerektiğini düşünüyorum, ama emin olmak istiyorum.

DÜZENLEME: Kuşakların aşkına, ABCMeta.register(object) çalışmayacaktır (deneyin). Ethan Furman, bu dava için aşağıdaki cevabında alternatif bir çözüm sunuyor.

+0

Her şey, nesnenin bir örneğidir. C-seviyesinde, “nesne (nesne)” nesnesini bile yapmak için hileler vardır. Şu anda bir referansım yok ama son altı ay içinde bir blog yayını var. – agf

cevap

1

object'dan türemeyen Python olmayan kodlarda (örneğin, C) sınıflar oluşturmak mümkündür.

Sen hiç __subclasshook__ ekleyerek İstediğinizi elde etmek mümkün olmalıdır senin Alpha:

2.x
--> import abc 
--> class Test(object): 
... __metaclass__ = abc.ABCMeta 
... @classmethod 
... def __subclasshook__(cls, C): 
...  return True 
... 
--> isinstance(dict(), Test) 
True 
--> isinstance(42, Test) 
True 
--> isinstance(0.59, Test) 
True 
--> class old_style: 
...  pass 
... 
--> isinstance(old_style(), Test) 
True 
+0

Hrm .. ama herhangi bir saf python türü her zaman nesneden türetilecek mi? Yaygın olarak kullanılan/standart kütüphane C modülleri (cStringIO, cDecimal, vb.) – maaku

+0

için geçerli olduğu sürece, bu yeterince iyi olabilir. Eski stil sınıflarını hala kullanmadıkça - ama bu ayrım sizin için önemli değilse, __subclasshook__ 'bunu görmezden gelebilir (örnekte olduğu gibi). –

+0

Harika! Alfa için ideal çözüm gibi görünüyor. Teşekkür Ethan! – maaku

0

, kullanıcı tanımlı sınıflar (ve birkaç stdlib sınıflar) varsayılan olarak nesneden türetmek değil . Bu 3.x'de giderilmiştir.

+0

Mayby, maaku'nun "tip/sınıf birleşiminden beri" ile kastettiği şey bu mu? – WolframH

+0

@WolframH: her * değişmez * nesnenin bir örneğidir. Örnekleri, nesne örnekleri olmayan sınıflar oluşturmak için hala (2.x içinde). –