2013-07-23 2 views
0

Вот пример:Есть ли способ, кроме __init__, получать значения при построении класса?

# class.py 
class MyString: 
    def __init__(self, str): 
     self.str = str 
    def __div__(self, sep): 
     return self.str.split(sep) 

>>> m = MyString('abcdabcdabcd') 
>>> print m/'b' 
['a', 'cda', 'cda', 'cd'] 

Метод __init__ принимает два параметра: первый, self, является сам объект экземпляра и str, во-вторых, это параметр, передаваемый в вызовом. Использует ли __init__ единственный способ получить значения в экземпляре моего класса?

Или, если я не объявлю метод __init__, выражения, подобные m = MyString('abcdabcdabcd'), перестанут работать?

ответ

0

По умолчанию, когда объект создается без параметров следующим образом

a = Class() 

, тогда вызывается метод __init__ без параметра.

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

class MyString: 
    def __div__(self, sep): 
     return self.str.split(sep) 
m = MyString() 

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

Вы можете добавить переменную класса следующим образом

class MyString: 
    str = '' 
    def __init__(self,str): 
     MyString.str = str 
    def __div__(self, sep): 
     return self.str.split(sep) 
m = MyString('aSAA') 
print(MyString.str) 
#print(m.str) 
['a', 'cda', 'cda', 'cd'] 

НО переменная класса является статическим, и это свойство самого класса не особенно к объекту.

0

инициализатор (Class.__init__()) является всегда используется для захвата аргументов, передаваемых в конструктор (Class()). Без него конструктор не будет работать по желанию.

0

@Ignacio получил init часть. Что касается вопроса о том, что это единственный способ: нет, вы можете получить значения в экземпляре своего класса с любой другой функцией. В вашем примере, вы могли бы

def set_string(self, new_string): 
    self.str = new_string() 

или можно назначить непосредственно значение для экземпляра:

>>> m = MyString('abcdabcdabcd') 
>>> m.str = "cbacbacba" 
0

Краткий ответ: рекомендуемая практика заключается в использовании метода __init__ в качестве «конструктора» для новых экземпляров. Если вы не предоставляете этот метод, вы можете создавать экземпляры (обычный путь) класса, вызывая имя класса без аргументов.

Более длинный ответ:

Самый простой альтернативой использованию __init__ является установка атрибутов после создания экземпляра:

class Foo(object): pass 
x = Foo() 
x.bar = 3 

staticmethod в классе может быть использован, чтобы сделать что-то вроде этого и вернуться экземпляр, например, если вы хотите реализовать шаблон singleton.Тривиальный пример:

class Foo(object): 
    @staticmethod 
    def newinstance(): # no self here 
    x = Foo() 
    x.bar = 3 
    return x 

y = Foo.newinstance() 
print y.bar # prints 3 

Более эзотерический способ инициализации объекта фактически не обеспечивая __init__ метода является use a metaclass для создания экземпляров иначе, чем обычно. Но метаклассы редко необходимы в реальных приложениях.

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