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