2015-06-09 2 views
3

Иногда, класс будет иметь "private"@classmethod, какие другие методы вызывают:Python «частный» classmethod и DRY

class FooClassThisSometimesHasALongNameEspIfAUnittestSubclasss(...): 
    @classmethod 
    def foo(): 
     ... 

    def bar(self): 
     ... 
     FooClassThisSometimesHasALongNameEspIfAUnittestSubclasss.foo() 
     ... 

Как можно видеть, имя класса повторяется; это, по общему признанию, вероятно, недостаточно серьезное, чтобы вызвать крах современных технологий, за которым следует апокалипсис зомби, но это все равно нарушение DRY и несколько раздражает.

Ответ на вопрос similar question about super заявил, что это one of the reasons for the Py3's new super.

В отсутствие какой-либо магии normal() функция (которая, в отличие от super(), возвращает текущий класс), есть ли способ избежать повторения?

ответ

2

Вы могли бы использовать:

self.__class__.foo() 
+0

Это очень полезно, спасибо! Однако, это так просто, почему это не было использовано для '' супер''? –

+0

@AmiTavory: super() может вызывать родительские классы, но также и классы братьев и сестер. Поэтому использовать понятие 'self .__ class__'. –

+0

Спасибо, но мой вопрос немного другой и касается дельта между старым '' супер'' и новым. Ваш отличный ответ подразумевает, что DRY не должен был действительно рассматриваться, и все же это как-то было. –