2010-06-10 18 views
11

ben yapabilmek istiyorum:Bir nesnenin __class__ attr dosyasını nerede ve nasıl değiştirebilirim?

>>> class a(str): 
...  pass 
... 
>>> b = a() 
>>> b.__class__ = str 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __class__ assignment: only for heap types 
bir class anahtar kelime ile tanımlandı
+0

: http://stackoverflow.com/questions/990758/reclassing-an-instance-in-python – balpha

+0

Ben Bu, "yığın tipi" teriminin çoğu Python programcıya aşina olmadığından ve Py dilinde herhangi bir yolun bulunmadığından, bu durumun yorumlayıcıdan oldukça kötü bir mesaj olduğunu söylemek ister. Örnekleri atanabilir __class__ sahip bir sınıf oluşturmak için 3 thon. Ya da en azından bir tane bulamadım. – holdenweb

cevap

6

yol:

>>> class C(str): 
...  def __getattribute__(self, name): 
...   if name == '__class__': 
...    return str 
...   else: 
...    return super(C, self).__getattribute__(name) 
...   
>>> c = C() 
>>> c.__class__ 
<type 'str'> 
+0

Çok büyük teşekkürler! Bunu çözmek için birçok saat harcadım! – seriyPS

1

Sadece sınıfları __class__ nitelik atama için kullanılabilir : Bu onu çözdük

>>> class C: 
    pass 

>>> class D: 
    pass 

>>> C().__class__ = D 
>>> 
+0

Hayır öyle değil. –

+0

Burada söyledikleri bu değil: http: //bytes.com/topic/python/answers/449635-assigning-self-__class__ –

+0

Aslında, __mro__' tek salt okunur öznitelik olduğunu düşünüyorum. –

6

Python 2 (. yani her şey nesne sınıfının türediği) birleşik bir nesne hiyerarşisi yoktur. Bu hiyerarşinin bir parçası olan herhangi bir şey sınıfı aracılığıyla çalınabilir, ancak bu şekilde değiştirilemez (veya hiç, gerçekten). Bunlara Python'un "türleri" denir ve bunlar C ile kodlanmışlardır. Türlerin örnekleri str, int, float, liste, tuple vs.'dir. Bu, türleri sınıflar ile aynı şekilde kullanamazsınız. Bir türün sınıfını değiştiremezsiniz, tür, vb. yöntemleri ekleyemez, kaldıramaz veya değiştiremezsiniz. Aşağıdaki transkript str (kodlanmış, dinamik olmayan C yapıları) gibi str sınıflar Ben A ve B aradım (değişken, dinamik, Python yapıları): yakından ilişkili

>>> str 
<type 'str'> 
>>> class A: 
...  pass 
... 
>>> a = A() 
>>> A 
<class __main__.A at 0xb747f2cc> 
>>> a 
<__main__.A instance at 0xb747e74c> 
>>> type(a) 
<type 'instance'> 
>>> type(A) 
<type 'classobj'> 
>>> type(str) 
<type 'type'> 
>>> type(type(a)) 
<type 'type'> 
>>> type(type(A)) 
<type 'type'> 
>>> A.foo = lambda self,x: x 
>>> a.foo(10) 
10 
>>> A().foo(5) 
5 
>>> str.foo = lambda self,x: x 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't set attributes of built-in/extension type 'str' 
>>> 'abc'.foo(5) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'str' object has no attribute 'foo' 
>>> class B: 
...  pass 
... 
>>> a.__class__ 
<class __main__.A at 0xb747f2cc> 
>>> a.__class__ = B 
>>> a 
<__main__.B instance at 0xb747e74c> 
>>> 'abc'.__class__ 
<type 'str'> 
>>> 'abc'.__class__ = B 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __class__ must be set to new-style class, not 'classobj' object 
>>> class B(object): 
...  pass 
... 
>>> 'abc'.__class__ = B 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __class__ assignment: only for heap types 
+0

Python 2'deki her şey bir nesne örneğidir. –

+0

Yani, tüm sınıflar tür örnekleri değildir. –

İlgili konular