2016-01-25 4 views
1

Представьте меня инициализатор с дополнительным параметромкласса доступа в инициализации необязательного параметра

def __init__(self, seed = ...): 

Теперь, если параметр не задан, я хочу, чтобы обеспечить значение по умолчанию. Но семя трудно вычислить, поэтому у меня есть метод класса, который предполагает семя, основанное на некотором переменном классе

MyClass.seedFrom(...) 

Теперь, как я могу назвать это от этого места? Если я использую self:

def __init__(self, seed = self.__class__.seedFrom(255)): 

Я определенно не знаю, что само в этой точке. Если я использую имя класса непосредственно (который я ненавижу делать):

def __init__(self, seed = MyClass.seedFrom(255)): 

он жалуется, что

имени «MyClass» не определен

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

+0

Yup, это делает его ноль по умолчанию и проверяет его позже. –

+1

Это абсолютно путинский путь. Значения параметров по умолчанию оцениваются только один раз, а во время определения метода имя класса не существует. Вы также можете рассмотреть возможность создания classmethod альтернативного конструктора. – jonrsharpe

+0

«Надеюсь, что питонический путь не ... делает его по умолчанию и проверяет его позже» - вы хотите, чтобы по умолчанию «семя» было исправлено или вы хотите выбрать новый каждый раз? Если вы хотите новый каждый раз, вы застряли с этим вариантом. – user2357112

ответ

2

в случае, если вам нужно только позвонить seedFrom один раз, вы можете сделать это, когда __init__ определена.

class MyClass: 

    # Defining seedFrom as a function outside 
    # the class is also an option. Defining it 
    # as a class method is not, since you still 
    # have the problem of not having a class to 
    # pass as the first argument when it is time 
    # to declare __init__ 
    @staticmethod 
    def seedFrom(): 
     ... 

    def __init__(self, seed=seedFrom()): 
     ... 
+0

Хороший ответ. Следует отметить, что определение staticmethod даже не принимает параметр класса (в отличие от определений класса). [за https://docs.python.org/2/library/functions.html#staticmethod] – F1Rumors

+1

Моя вина. Я начал определять его как метод класса, прежде чем понял, что не будет работать, и забыл удалить «cls» из списка аргументов. – chepner

+0

Да, автономная функция будет работать, но как насчет инкапсуляции? ;) – Uko

0

Если вы должны сделать это в инициализации и хотите метод семян, чтобы быть в классе, то вы можете сделать это метод класса, например, следующим образом:

class SomeClass(object): 

    defaultSeed = 255 

    @classmethod 
    def seedFrom(cls, seed): 
     pass # some seed 

    def __init__(self, seed=None): 
     self.seedFrom(seed if seed is not None else self.defaultSeed) 
     # etc 
+0

@chepner ваше редактирование, хотя и не является неправильным, также не обязательно является намерением. Любое «ложное» семя привело бы к посеву по умолчанию, тогда как теперь только не снабжая семенами или явно используя «Нет», этот эффект будет иметь. – F1Rumors

Смежные вопросы