2013-10-31 14 views
5

__metaclass__ = abc.ABCMeta kullanırken bu fazladan, alt çizgiden olmayan mro yöntemini kullanarak karşılaştım. Bir tuple yerine bir liste döndürmesi dışında __mro__ ile aynı görünmektedir. İşte rastgele örneği (ideone snippet) var:Bir sınıfın mro yöntemi ile __mro__ özniteliği arasındaki fark nedir?

import abc 
import copy 

class Life(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    def reproduce(self): 
     pass 

class Bacterium(Life): 
    def reproduce(self): 
     return copy.deepcopy(self) 

wiggly = Bacterium() 

print wiggly.__class__.__mro__ 
# (<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>) 

print wiggly.__class__.mro() 
# [<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>] 

Bu ABCMeta özgü olmayıp tüm yeni tarzı sınıflarında kullanılabilir olduğunu sonra bulundu.

Peki ... neden? Bu ne yapıyor __mro__ değil mi? the documentation Doğrudan

cevap

7

:

Bu yöntem onun örnekleri için yöntem çözünürlük sırası özelleştirmek için bir metaclass tarafından geçersiz kılınabilir. Sınıf anında çağrılır ve sonucu __mro__'da saklanır.

Pretty kendini açıklayıcı bana ...

mro() instanciation çağırdı ve __mro__ onun sonucu saklar. Gerçekten aynı amaçlara sahip değiller.

+1

Ne zaman kullanmalıyım? Mro() işlevinin standart uygulaması, önbellek olarak __mro__ işlevini kullanıyor mu? Eğer evet ise, o zaman bu __mro__' için sebep olur ve bir uygulama detayı olarak düşünülmelidir. Aksi halde, bunun amacı nedir? – burnpanck

+0

@burnpanck. __mro__', "super" tarafından açıkça kullanılıyor: https://docs.python.org/3/reference/datamodel.html#invoking-descriptors –

İlgili konular