Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 23, 2014 12:58:51

Suliman
Зарегистрирован: 2013-06-18
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызвать метод из класса

Как я понял следующая строка – конструктор

def __init__(self):
этот конструктор приводит к выполнению кода идущего после него, так? Что будет если его не объявлять?

Я написал следующий код:
class Test:
	def __init__(self):
		def SayHello(name):
			print ('Hello, {0}!').format(name)
tst = Test()
tst.SayHello('Dima')
1. Правильно ли я сделал что определил функцию SayHello внутри конструктора? Как мне теперь к ней обратиться?
2. Указанный код не работает и я не могу понять что мне передавать в конструктор self или self, name?
3. Как мне обращаться к функции вложенной в функцию? ClassName.foo.bar() ?

Офлайн

#2 Апрель 23, 2014 14:53:27

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вызвать метод из класса

Suliman
все ваши вопросы в этом сообщении говорят что вы лишь отдаленно имеете понятие о классах. Выберите правильный подход - изучите специализированную литературу. (а то получается без букваря слова читать пытаетесь). Это мой вам совет.
0) Так или иначе у класса всегда есть базовый конструктор, он делает всю внутреннюю работу . Если вы для вашего класса ничего не указываете - выполняется только он и ничего более.
1) нет, функция, насколько я вас понимаю, должна быть методом класса. В таком случае она должна быть на 1 внутреннем уровне вложенности (как в вашем коде конструктор) …
2)…. и принимать первым аргументом ссылку на экземпляр класса, т.е. в вашем случае self,names где self это ссылка, а name параметр метода
3) скорее всего никак, на то она и вложенная.

class Test:
    def __init__(self):
            value=1 # как правило здесь указывают инициализирующий код
    def SayHello(self, name):
        print ('Hello, {0}!').format(name)
tst = Test()
tst.SayHello('Dima')



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Апрель 23, 2014 23:14:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Вызвать метод из класса

Suliman
Как я понял следующая строка – конструктор
нет, конструктор создаёт экземпляр класса, а __init__ вызывается у уже созданного экземпляра, конструктор - это __new__

__init__ - это инициализатор (неофициальное определение)

Suliman
Что будет если его не объявлять?
он будет пустым (унаследован сверху)

>>> class A:
...   pass
... 
>>> a = A()
>>> a.__init__
<method-wrapper '__init__' of A object at 0xb732cd6c>
>>>

Suliman
1. Правильно ли я сделал что определил функцию SayHello внутри
получилась локальная функция - типа локальной переменной, которая создаётся при каждом вызове метода __init__ и разрушается при его завершении

Suliman
я не могу понять что мне передавать
во все методы класса передаётся ссылка на экземпляр, которому принадлежит метод

>>> class A:
...   pass
... 
>>> a = A()
здесь создан экземпляр a класса A
у экземпляра a есть набор методов, и при вызове любого метода экземпляр a передаёт себя в метод первым аргументом (неявно)

бывают специальные методы (статические, методы класса), с которыми экземпляр обращается по-другому

в общем, прочитай книжку какую-нибудь, на догадках неэффективно учиться



Отредактировано py.user.next (Апрель 23, 2014 23:15:35)

Офлайн

#4 Апрель 24, 2014 09:15:21

Suliman
Зарегистрирован: 2013-06-18
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызвать метод из класса

py.user.next
получилась локальная функция - типа локальной переменной, которая создаётся при каждом вызове метода __init__ и разрушается при его завершении
А метод этот вызывается при каждом создании класса, так? Т.е. при каждом создание класса я получаю возможность использовать этот метод?

С другой стороны при создание экземпляра класса я так же смогу получить доступ ко всем методам внутри него? Какая разница? Метод __init__ же при создание экземпляра класса вывается.

Офлайн

#5 Апрель 24, 2014 12:17:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Вызвать метод из класса

Suliman
А метод этот вызывается при каждом создании класса, так?
при создании экземпляра метод __init__ вызывается у уже созданного экземпляра
поэтому он не является конструктором

он как бы заполняет созданный экземпляр начальными данными (инициализирует)
а конструктор создаёт, поэтому конструктор - это __new__

Suliman
Т.е. при каждом создание класса я получаю возможность использовать этот метод?
он сам вызывается

вот мы его заменили на заглушку
>>> class A:
...     __init__ = lambda self: None
... 
>>> a = A()
>>> a.__init__
<bound method A.<lambda> of <__main__.A object at 0xb73ace2c>>
>>> id(a)
3074084396
>>>
при этом экземпляр создался и существует

а вот мы добавили конструктор
>>> class A:
...     __new__ = lambda cls: None
...     __init__ = lambda self: None
... 
>>> a = A()
>>> type(a)
<class 'NoneType'>
>>>
в результате при создании экземпляра он подменился None'ом
вместо экземпляра класса A вернулся объект None (экземпляр класса NoneType)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version