Python 3.x'te python nesnesinden miras almak gerekli veya yararlı mı?


94

Eski python sürümünde, python'da bir sınıf oluşturduğunuzda , nesnenizin yeni bir stil nesnesi olmasına izin veren özel bir yerleşik python öğesini anladığım kadarıyla nesneden miras alabilir .

Yeni sürüm (> 3.0 ve 2.6) ne olacak? Sınıf nesnesi hakkında googledim ama çok fazla sonuç alıyorum (bariz nedenlerden dolayı). Herhangi bir ipucu?

Teşekkür!


2
Kodunuz 2.x altında da kullanılacaksa, açık olmakta fayda var.
smci

1
Bu soruya iyi cevap verildi: stackoverflow.com/questions/4015417/…
nngeek

Yanıtlar:


94

objectPython 3'te yeni bir stile sahip olmak için miras almanıza gerek yoktur . Tüm sınıflar yeni stildir.


5
Bunun , Python 3.1'de objectaçık yazıp (object)
yazmadığına

8
Yapmanıza gerek yok, ancak "Python kodunu Python 3'e taşıma" hala geçerli olduğunu söylüyor: docs.python.org/py3k/howto/pyporting.html#subclass-object Ayrıca: docs.python.org/reference/ …
hyperboreean

Gönderen bu yazı nngeek en yorumunda belirtildiği, (Py2 sadece gerçekten alakalı) yeni tarzı vs eski tarz için iyi bir istikrarlı referans gibi görünüyor geçerli: docs.python.org/2/reference/... - Yukarıdaki linkler var gibiydi beri değişti.
Eric Cousineau

80

Bunun eski bir soru olduğunun farkındayım, ancak piton 3'te bile bu iki şeyin tamamen aynı şey olmadığını belirtmekte fayda var.

Açıkça miras objectalırsanız, gerçekte yaptığınız şey , o anda neyin işaret ettiğine bakılmaksızın miras almaktır builtins.object .

Bu nedenle, bazı nedenlerden dolayı nesneyi geçersiz kılan (çok tuhaf) bir modüle sahip olabilirim. Bu ilk modüle "newobj.py" adını vereceğiz:

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

Sonra başka bir dosyada ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Sonra üçüncü bir dosyada (aslında çalıştırabiliriz):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

Dolayısıyla, açıkça nesneden miras alması durumunda, örtük kalıtıma izin verdiğiniz yerden farklı bir davranışla karşılaştığımızı görebilirsiniz.


14
Alakalı çünkü genel olarak beklenti, davranışın eşdeğer olmasıdır. Eşdeğer değil, dolayısıyla gözlemlerim.
Philip Adler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.