SORU
14 Mart 2012, ÇARŞAMBA


() süper yükseltir "eğer data: tür, değil classobj" yeni tarzı sınıf için olmalı

super() aşağıdaki kullanın eğer data yükseltir: neden?

>>> from  HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
...     def __init__(self):
...         super(TextParser, self).__init__()
...         self.all_data = []
...         
>>> TextParser()
(...)
TypeError: must be type, not classobj

StackOverflow benzer bir soru var: hata kullanıcı sınıfı yeni tarzı bir sınıf değil bu gerçeği ile açıklanabilir python super() raises TypeError ! Why?,. Ancak, sınıf yukarıda object devralan yeni tarzı bir sınıf.:

>>> isinstance(HTMLParser(), object)
True

Neyi kaçırıyorum? Nasıl super(), burada kullanabilir miyim?

super(TextParser, self).__init__() yerine HTMLParser.__init__(self) kullanarak çalışacak, ama eğer data anlamak istiyorum.

PS: Joachim tarzı yeni bir sınıf örneği object olmakla eşdeğer olmadığını belirtti. Karşısında birçok kez, bu yüzden karışıklık (object örnek testine göre tarzı yeni bir sınıf örnek test, örnek:* *34) okudum.

CEVAP
15 Mart 2012, PERŞEMBE


Pekala, her zamanki gibi "super() eski tarz bir sınıf ile kullanılamaz".

Ancak, önemli olan nokta budoğru test"bu yeni tarzı vardırörnek(nesne yani?"

>>> class OldStyle: pass
>>> instance = OldStyle()
>>> issubclass(instance.__class__, object)
False

ve değil (soru olarak):

>>> isinstance(instance, object)
True

İçinsınıflardoğru "yeni tarzı bu bir sınıf" test:

>>> issubclass(OldStyle, object)  # OldStyle is not a new-style class
False
>>> issubclass(int, object)  # int is a new-style class
True

çok önemli bir noktatarzı eski sınıflarla yanisınıfbir örneği veyazınfarklıdır. Burada, OldStyle().__class__ type(OldStyle()) instance tip ise object, mirasçı olmayan OldStyle,,yokobject devralır. Temelde, eski tarz bir sınıf sadece tür nesneleri instance (yeni tarzı ise sınıfta sınıfın kendisi olan nesneleri oluşturur) oluşturur. Bu OldStyle() object bir neden olabilir: object (kendi sınıf gerçeğini de göz ardı . type() devralır ^em>değilobject miras sayılmaz: eski tip sınıflar sadece yazın yeni nesneler instance yapı). Kısmi referans: http://stackoverflow.com/a/9699961/42973.

Fark da görülebilir: PS:

>>> type(OldStyle)  # OldStyle creates objects but is not itself a type
classobj
>>> isinstance(OldStyle, type)
False
>>> type(int)  # A new-style class is a type
type

(eski tip sınıflardeğilörneklerini türü) edemezler türleri.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • Lena Danya

    Lena Danya

    11 NİSAN 2010