Питон. Объясниет про классы
От: Sheridan Россия  
Дата: 05.08.10 18:26
Оценка:
Приветствую!
Наконец то руки дошли пощупать питон... Пока что щупаю 2,6 версию.
Уважаемые, объясните пожалуйста, как в нем нужно создавать новые экземпляры классов? Как передавать параметры в конструктор родителя?
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re: Питон. Объясниет про классы
От: Temoto  
Дата: 05.08.10 18:30
Оценка:
S>Приветствую!
S>Наконец то руки дошли пощупать питон... Пока что щупаю 2,6 версию.
S>Уважаемые, объясните пожалуйста, как в нем нужно создавать новые экземпляры классов? Как передавать параметры в конструктор родителя?

http://docs.python.org/tutorial/classes.html
Что-то из этого туториала непонятно?
Re: Питон. Объясниет про классы
От: Курилка Россия http://kirya.narod.ru/
Дата: 05.08.10 18:37
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Приветствую!

S>Наконец то руки дошли пощупать питон... Пока что щупаю 2,6 версию.
S>Уважаемые, объясните пожалуйста, как в нем нужно создавать новые экземпляры классов? Как передавать параметры в конструктор родителя?

А оф. доков не хватает?

>>> class MyClass(object):
... pass
...
>>> x = MyClass()
>>> x.__class__
<class '__main__.MyClass'>

— это канает на первый вопрос?

Ответ на 2-й вопрос в районе super(type[, object-or-type])
Поподробнее
От: Sheridan Россия  
Дата: 05.08.10 19:04
Оценка:
Приветствую, Sheridan, вы писали:

S> Приветствую!

S> Наконец то руки дошли пощупать питон... Пока что щупаю 2,6 версию.
S> Уважаемые, объясните пожалуйста, как в нем нужно создавать новые экземпляры классов? Как передавать параметры в конструктор родителя?

Наверно плохо объяснил...
Вот код:
class a:
  data = {}
  def __init__(self, var, val):
    self.data[var] = val
  def dump(self):
    print self.data
class b(a):
  def __init__(self, val):
    self.data['0'] = val
    
ca0 = a('a', 'aa')
ca0.dump()
cb0 = b('1')
cb0.dump()
ca1 = a('b', 'bb')
ca1.dump()
cb0 = b('2')
cb0.dump()

1. Как сделать так, чтобы создавать экземпляры классов, чтобы питон не пользовал один и тотже экземпляр каждый раз, что видно по выводу:
{'a': 'aa'}
{'a': 'aa', '0': '1'}
{'a': 'aa', '0': '1', 'b': 'bb'}
{'a': 'aa', '0': '2', 'b': 'bb'}


2. Что написать в __inшt__ класа b, чтобы вызвать __init__ класса a с нужными параметрами?
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[2]: Питон. Объясниет про классы
От: Sheridan Россия  
Дата: 05.08.10 19:09
Оценка:
Приветствую, Курилка, вы писали:

К> — это канает на первый вопрос?

Нет, питоне не создает экземпляры похоже, а пользует один и тотже.

К> Ответ на 2-й вопрос в районе super(type[, object-or-type])

Взял оттуда пример, чуть дописал..
class B:
  def method(self, arg):
    print ("-- %s --" % arg)

# example ---
class C(B):
  def method(self, arg):
    super(C, self).method(arg)
# example ---

c = C()
c.method('!!!')


Вот вывод:
eee-sheridan munin # ./tp  
Traceback (most recent call last):
  File "./tp", line 60, in <module>
    c.method('!!!')
  File "./tp", line 57, in method
    super(C, self).method(arg)
TypeError: super() argument 1 must be type, not classobj
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re[2]: Питон. Объясниет про классы
От: Sheridan Россия  
Дата: 05.08.10 19:10
Оценка:
Приветствую, Temoto, вы писали:

T> http://docs.python.org/tutorial/classes.html

T> Что-то из этого туториала непонятно?

Тут
Автор: Sheridan
Дата: 05.08.10
avalon 1.0rc3 rev 306, zlib 1.2.3 (17.12.2009 01:06:14 MSK +03:00)(Qt 4.6.0)
Matrix has you...
Re: Поподробнее
От: Temoto  
Дата: 05.08.10 19:15
Оценка: 12 (1)
S>> Приветствую!
S>> Наконец то руки дошли пощупать питон... Пока что щупаю 2,6 версию.
S>> Уважаемые, объясните пожалуйста, как в нем нужно создавать новые экземпляры классов? Как передавать параметры в конструктор родителя?

S>Наверно плохо объяснил...

S>Вот код:
S>
S>class a:
S>  data = {}
S>  def __init__(self, var, val):
S>    self.data[var] = val
S>  def dump(self):
S>    print self.data
S>class b(a):
S>  def __init__(self, val):
S>    self.data['0'] = val
    
S>ca0 = a('a', 'aa')
S>ca0.dump()
S>cb0 = b('1')
S>cb0.dump()
S>ca1 = a('b', 'bb')
S>ca1.dump()
S>cb0 = b('2')
S>cb0.dump()
S>

S>1. Как сделать так, чтобы создавать экземпляры классов, чтобы питон не пользовал один и тотже экземпляр каждый раз, что видно по выводу:

Три простых правила.


1. имена классов начинаются с заглавных букв.


2. в первый год питона нельзя объявлять аттрибуты классов.

class A:
class_attr = нельзя

def __init__(self):
self.instance_attr = 'можно'


3. до третьей версии питона необходимо наследовать все свои классы от object.

class A: нельзя

class A(object): можно


S>
S>{'a': 'aa'}
S>{'a': 'aa', '0': '1'}
S>{'a': 'aa', '0': '1', 'b': 'bb'}
S>{'a': 'aa', '0': '2', 'b': 'bb'}
S>


S>2. Что написать в __inшt__ класа b, чтобы вызвать __init__ класса a с нужными параметрами?


super(b, self).__init__(нужные параметры)

super не будет работать, если не соблюдать правило 3.


Старые библиотеки тоже не соблюдают это правило, поэтому иногда нужно писать так:

ParentClass.__init__(self, нужные параметры)
Re: Поподробнее
От: eugals Россия  
Дата: 05.08.10 19:18
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, Sheridan, вы писали:


S>> Приветствую!

S>1. Как сделать так, чтобы создавать экземпляры классов, чтобы питон не пользовал один и тотже экземпляр каждый раз, что видно по выводу:

class a:
  def __init__(self, var, val):
    self.data = { var: val }
  def dump(self):
    print self.data
Re: Поподробнее
От: Курилка Россия http://kirya.narod.ru/
Дата: 05.08.10 19:22
Оценка: 12 (1)
Здравствуйте, Sheridan, Вы писали:


S>Наверно плохо объяснил...

S>Вот код:
[cut]

ну доки-то читай, вроде линки все дали

Конкретно этот пример:

>>> class a(object):
... def __init__(self, var, val):
... self.data = {var: val}
... def dump(self):
... print(self.data)
...
>>> class b(a):
... def __init__(self, val):
... super(b, self).__init__('0', val)
...
>>> ca0 = a('a', 'aa')
>>> ca0.dump()
{'a': 'aa'}
>>> cb0 = b('1')
>>> cb0.dump()
{'0': '1'}
>>> ca1 = a('b', 'bb')
>>> ca1.dump()
{'b': 'bb'}
>>> cb0 = b('2')
>>> cb0.dump()
{'0': '2'}

Re[3]: Питон. Объясниет про классы
От: Курилка Россия http://kirya.narod.ru/
Дата: 05.08.10 19:25
Оценка: 12 (1)
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, Курилка, вы писали:


К>> — это канает на первый вопрос?

S>Нет, питоне не создает экземпляры похоже, а пользует один и тотже.

Ты путаешь переменные класса и переменные объекта.

К>> Ответ на 2-й вопрос в районе super(type[, object-or-type])

S>Взял оттуда пример, чуть дописал..
S>
...
S>


S>Вот вывод:

S>
S>eee-sheridan munin # ./tp  
S>Traceback (most recent call last):
S>  File "./tp", line 60, in <module>
S>    c.method('!!!')
S>  File "./tp", line 57, in method
S>    super(C, self).method(arg)
S>TypeError: super() argument 1 must be type, not classobj

S>


Читай доки, там же всё написано:

Note: super() only works for new-style classes.

Re[2]: Поподробнее
От: neFormal Россия  
Дата: 05.08.10 20:43
Оценка:
Здравствуйте, Temoto, Вы писали:

T>2. в первый год питона нельзя объявлять аттрибуты классов.


мм.. почему?.
...coding for chaos...
Re[3]: Поподробнее
От: Temoto  
Дата: 05.08.10 20:57
Оценка:
T>>2. в первый год питона нельзя объявлять аттрибуты классов.

F>мм.. почему?.


Safety measure. Чтобы потом не удивляться, чего это аттрибут не изменился. Сначала нужно разобраться как всё работает.
Re[2]: Поподробнее
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 06.08.10 07:06
Оценка: +1
Здравствуйте, Temoto, Вы писали:

T>Три простых правила.

T>1. имена классов начинаются с заглавных букв.

В стандартной библиотеке это сплошь и рядом нарушается, и ничего — как-то живы:)

T>2. в первый год питона нельзя объявлять аттрибуты классов.


T>class A:

T> class_attr = нельзя

T> def __init__(self):

T> self.instance_attr = 'можно'

Это очень вредный совет. Атрибуты класса задают дефолтные значения и одновременно объявляют сам факт наличия такого атрибута. Если перестать их объявлять, как минимум начинаешь сбивать с толку pychecker и аналоги, замусоривая отчёты бессмысленными сообщениями и теряя в них полезные жалобы.

Разумеется, с атрибутами класса, так же как с дефолтными значениями в функциях, надо поступать осторожно. У меня была ситуация, когда я написал x = [] не в конструкторе, а в классе, и список стал общим на весь класс. Пришлось срочно апгрейдить код на десятке живых систем.:) Но твоё лечение хуже болезни.

T>3. до третьей версии питона необходимо наследовать все свои классы от object.


T>class A: нельзя

T>class A(object): можно

Бессмыслица, кроме случаев, когда тебя всегда и во всём интересуют свойства new-style классов. Разумеется, у них много полезных свойств, но местами и вредных. Пару раз сталкивался с тем, что от перехода на new style происходило резкое торможение, приходилось рефакторить логику. Для нового кода я соглашусь с этим правилом, для поддержки старого — категорически нет.
The God is real, unless declared integer.
Re[3]: Поподробнее
От: Temoto  
Дата: 06.08.10 09:04
Оценка:
T>>2. в первый год питона нельзя объявлять аттрибуты классов.

T>>class A:

T>> class_attr = нельзя

T>> def __init__(self):

T>> self.instance_attr = 'можно'

N>Это очень вредный совет. Атрибуты класса задают дефолтные значения и одновременно объявляют сам факт наличия такого атрибута. Если перестать их объявлять, как минимум начинаешь сбивать с толку pychecker и аналоги, замусоривая отчёты бессмысленными сообщениями и теряя в них полезные жалобы.


В динамическом (это важно) языке Python нет понятия "факт наличия аттрибута". Вы, может быть, что-то осмысленное подразумевали под этими словами, но я не понял.

А у меня pylint находит self.foo = '' и не замусоривает отчёт. Чините вашу проверялку.



Я понимаю, конечно, надо покритиковать всё. И жара, и дым, всё это влияет на людей. Я дал советы человеку, который задал первый вопрос по питону. И для него они, на мой взгляд, полезны. И пусть он через пол-года скажет: вредные это были советы или нет. Когда он разберётся в тонкостях классовых аттрибутов и new-style классов, тогда будет сам умышленно нарушать эти правила. И это тоже будет нормально.
Re[4]: Поподробнее
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 06.08.10 09:23
Оценка:
Здравствуйте, Temoto, Вы писали:

T>>>2. в первый год питона нельзя объявлять аттрибуты классов.


T>>>class A:

T>>> class_attr = нельзя

T>>> def __init__(self):

T>>> self.instance_attr = 'можно'

N>>Это очень вредный совет. Атрибуты класса задают дефолтные значения и одновременно объявляют сам факт наличия такого атрибута. Если перестать их объявлять, как минимум начинаешь сбивать с толку pychecker и аналоги, замусоривая отчёты бессмысленными сообщениями и теряя в них полезные жалобы.


T>В динамическом (это важно) языке Python нет понятия "факт наличия аттрибута".


С каких это пор? Если написано a.x и x не существует, будет ошибка.

T> Вы, может быть, что-то осмысленное подразумевали под этими словами, но я не понял.


Да, осмысленное.

T>А у меня pylint находит self.foo = '' и не замусоривает отчёт. Чините вашу проверялку.


У pylint достаточно граблей, чтобы его не использовать. pychecker в целом оказался значительно более вменяемым.

T>Я понимаю, конечно, надо покритиковать всё. И жара, и дым, всё это влияет на людей.


Не надо пытаться сводить позицию собеседника к влиянию жары. Кстати, дыма у нас нет.

T> Я дал советы человеку, который задал первый вопрос по питону. И для него они, на мой взгляд, полезны. И пусть он через пол-года скажет: вредные это были советы или нет. Когда он разберётся в тонкостях классовых аттрибутов и new-style классов, тогда будет сам умышленно нарушать эти правила. И это тоже будет нормально.


Речь никак не о новичке и Sheridan в состоянии выбрать грамотный совет из нескольких.
The God is real, unless declared integer.
Re[5]: Поподробнее
От: Temoto  
Дата: 06.08.10 10:09
Оценка:
T>>>>class A:
T>>>> class_attr = нельзя

T>>>> def __init__(self):

T>>>> self.instance_attr = 'можно'

N>>>Это очень вредный совет. Атрибуты класса задают дефолтные значения и одновременно объявляют сам факт наличия такого атрибута. Если перестать их объявлять, как минимум начинаешь сбивать с толку pychecker и аналоги, замусоривая отчёты бессмысленными сообщениями и теряя в них полезные жалобы.


T>>В динамическом (это важно) языке Python нет понятия "факт наличия аттрибута".


N>С каких это пор? Если написано a.x и x не существует, будет ошибка.


Этот пример как раз игнорирует выделенное слово "динамическом". Попытаюсь объяснить, что я имел в виду. Два пункта:
1) объявление аттрибута класса (или инстанса) не даёт гарантии, что позже a.x не поднимет AttributeError. Вот в Си поле структуры будет всегда, да, это неизменный факт, а тут нет. Факт наличия аттрибута может быть разным в двух разных попытках доступа к аттрибуту (примеры нужны?). Строго говоря, это конечно, всё ещё "факт", но пользы от изменяющегося факта имхо, мало.
2) "аттрибуты класса объявляют факт наличия такого аттрибута". Это скорее похоже на личную привычку и ожидания от своего кода. Т.е. "я пишу такой код, в котором для себя и будущих читателей обозначаю аттрибутами класса какие аттрибуты я потом буду использовать". Потому что во-первых, я не встречал никаких официальных рекомендаций подобной этой; а в отсутствие таковых, глядя на код других программистов, могу уверенно сказать, что гораздо чаще (на моём опыте) факт наличия аттрибута объявляется именно через self.attr в __init__.

Другими словами, ткните меня носом в какой-нибудь документ, который задаёт аттрибутам класса именно такую семантику, как вы описали выше. Иначе, можно считать что мы просто по-разному воспринимаем смысл и предназначение классовых аттрибутов и обе точки зрения не "вредные".

T>> Вы, может быть, что-то осмысленное подразумевали под этими словами, но я не понял.

N>Да, осмысленное.

Что?

T>>А у меня pylint находит self.foo = '' и не замусоривает отчёт. Чините вашу проверялку.


N>У pylint достаточно граблей, чтобы его не использовать. pychecker в целом оказался значительно более вменяемым.


Наверное, я не сравнивал. Ну вот, есть очевидный баг в pychecker и есть повод его исправить.

T>>Я понимаю, конечно, надо покритиковать всё. И жара, и дым, всё это влияет на людей.


N>Не надо пытаться сводить позицию собеседника к влиянию жары. Кстати, дыма у нас нет.


Это шутка такая.
Завидую, что дыма нет.
Re[6]: Поподробнее
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 06.08.10 10:32
Оценка:
Здравствуйте, Temoto, Вы писали:

N>>С каких это пор? Если написано a.x и x не существует, будет ошибка.

T>Этот пример как раз игнорирует выделенное слово "динамическом". Попытаюсь объяснить, что я имел в виду. Два пункта:
T>1) объявление аттрибута класса (или инстанса) не даёт гарантии, что позже a.x не поднимет AttributeError. Вот в Си поле структуры будет всегда, да, это неизменный факт, а тут нет. Факт наличия аттрибута может быть разным в двух разных попытках доступа к аттрибуту (примеры нужны?). Строго говоря, это конечно, всё ещё "факт", но пользы от изменяющегося факта имхо, мало.

Верно, но есть принципиальное различие между подходами, когда стремятся сделать управляемую обстановку и работать в её рамках, и тем, когда принципиально "хачат" для создания трюков и странных решений. В случае Питона никто не мешает вызвать delattr(), но это уже хак, точно так же как в Си, когда подсунут указатель на что-то несуществующее или недопустимое (и неважно, что формально можно достучаться к элементу).

В случае Питона, усреднённым нормативным подходом является то, что когда пишут z.x, предполагают, что у объекта z есть атрибут x и это обусловлено всем контекстом исполнения. И если x это переменная (а не что-то хитрое, реагирующее на __getattribute__()) — то ей крайне желательно существовать всё время жизни любого объекта класса этого z — иначе статическая проверка на допустимость z.x не пройдёт.

T>2) "аттрибуты класса объявляют факт наличия такого аттрибута". Это скорее похоже на личную привычку и ожидания от своего кода. Т.е. "я пишу такой код, в котором для себя и будущих читателей обозначаю аттрибутами класса какие аттрибуты я потом буду использовать". Потому что во-первых, я не встречал никаких официальных рекомендаций подобной этой; а в отсутствие таковых, глядя на код других программистов, могу уверенно сказать, что гораздо чаще (на моём опыте) факт наличия аттрибута объявляется именно через self.attr в __init__.


Не знаю, где Вы видите код других программистов, но я смотрю в качестве хорошего примера на стандартную библиотеку. В стандартной библиотеке общей тенденции нет, но объявление в классе используется более чем в половине случаев. Задание же значения в конструкторе безусловно необходимо только при получении из аргументов или если иначе не получится переменная объекта.

T>>>А у меня pylint находит self.foo = '' и не замусоривает отчёт. Чините вашу проверялку.

N>>У pylint достаточно граблей, чтобы его не использовать. pychecker в целом оказался значительно более вменяемым.
T>Наверное, я не сравнивал. Ну вот, есть очевидный баг в pychecker и есть повод его исправить.

Это не баг.

T>>>Я понимаю, конечно, надо покритиковать всё. И жара, и дым, всё это влияет на людей.

N>>Не надо пытаться сводить позицию собеседника к влиянию жары. Кстати, дыма у нас нет.
T>Это шутка такая.



T>Завидую, что дыма нет.
The God is real, unless declared integer.
Re[7]: Поподробнее
От: Temoto  
Дата: 06.08.10 11:00
Оценка:
T>>2) "аттрибуты класса объявляют факт наличия такого аттрибута". Это скорее похоже на личную привычку и ожидания от своего кода. Т.е. "я пишу такой код, в котором для себя и будущих читателей обозначаю аттрибутами класса какие аттрибуты я потом буду использовать". Потому что во-первых, я не встречал никаких официальных рекомендаций подобной этой; а в отсутствие таковых, глядя на код других программистов, могу уверенно сказать, что гораздо чаще (на моём опыте) факт наличия аттрибута объявляется именно через self.attr в __init__.

N>Не знаю, где Вы видите код других программистов, но я смотрю в качестве хорошего примера на стандартную библиотеку. В стандартной библиотеке общей тенденции нет, но объявление в классе используется более чем в половине случаев. Задание же значения в конструкторе безусловно необходимо только при получении из аргументов или если иначе не получится переменная объекта.


То есть, на одной чаше весов у нас субъективное восприятие, что именно аттрибут класса устанавливает факт наличия аттрибута и pychecker, который не работает с аттрибутами заданными иначе. На другой — субъективное восприятие, что аттрибуты создаются в __init__, pylint, который понимает оба варианта и потенциальные баги с мутабельными аттрибутами класса.

T>>>>А у меня pylint находит self.foo = '' и не замусоривает отчёт. Чините вашу проверялку.

N>>>У pylint достаточно граблей, чтобы его не использовать. pychecker в целом оказался значительно более вменяемым.
T>>Наверное, я не сравнивал. Ну вот, есть очевидный баг в pychecker и есть повод его исправить.

N>Это не баг.


Хакей, конечно, это фича. Но этот не-баг противоречит вышеупомянутому усреднённому нормативному подходу, правда?

Я имею в виду, что если я напишу
class Truboji(list):
  def __init__(self):
    self.ji_size = 0

print Truboji().ji_size

живой программист не удивится доступу к аттрибуту ji_size и я ожидаю, что проверялка тоже скажет "проблем нет".
Re[8]: Поподробнее
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 06.08.10 14:59
Оценка:
Здравствуйте, Temoto, Вы писали:

N>>Не знаю, где Вы видите код других программистов, но я смотрю в качестве хорошего примера на стандартную библиотеку. В стандартной библиотеке общей тенденции нет, но объявление в классе используется более чем в половине случаев. Задание же значения в конструкторе безусловно необходимо только при получении из аргументов или если иначе не получится переменная объекта.


T>То есть, на одной чаше весов у нас субъективное восприятие, что именно аттрибут класса устанавливает факт наличия аттрибута и pychecker, который не работает с аттрибутами заданными иначе. На другой — субъективное восприятие, что аттрибуты создаются в __init__, pylint, который понимает оба варианта и потенциальные баги с мутабельными аттрибутами класса.


Именно так. Но есть один нюанс: описание состава класса соответствует как отраслевой традиции (ибо не питоном единым жив программист), так и желанию увидеть, чем же именно отличаются все экземпляры данного класса. И отсюда и получается, что если какое-то поле есть у всех и какой-то метод есть у всех — он должен быть явно виден на уровне класса, без анализа, что же там за хакерство в конструкторе.

А то, что можно это перехакать до неузнаваемости — говорит разве что в пользу того, что только там, где неизвестно, будет атрибут x или нет, надо не описывать его на уровне класса. А в остальных случаях (>>90% практики) — описывать.

T>Хакей, конечно, это фича. Но этот не-баг противоречит вышеупомянутому усреднённому нормативному подходу, правда?


Которому из? Моему — не противоречит.

T>Я имею в виду, что если я напишу

T>
T>class Truboji(list):
T>  def __init__(self):
T>    self.ji_size = 0

T>print Truboji().ji_size
T>

T>живой программист не удивится доступу к аттрибуту ji_size и я ожидаю, что проверялка тоже скажет "проблем нет".

А теперь представь себе, что конструктор весит 2 экрана, несколько существенно разных веток выполнения и слишком сложно окинуть одним взглядом, чтобы узнать, в какой ветке ji_size задаётся, а в какой — нет...
The God is real, unless declared integer.
Re[9]: Поподробнее
От: Temoto  
Дата: 06.08.10 16:09
Оценка:
T>>То есть, на одной чаше весов у нас субъективное восприятие, что именно аттрибут класса устанавливает факт наличия аттрибута и pychecker, который не работает с аттрибутами заданными иначе. На другой — субъективное восприятие, что аттрибуты создаются в __init__, pylint, который понимает оба варианта и потенциальные баги с мутабельными аттрибутами класса.

N>Именно так. Но есть один нюанс: описание состава класса соответствует как отраслевой традиции (ибо не питоном единым жив программист), так и желанию увидеть, чем же именно отличаются все экземпляры данного класса. И отсюда и получается, что если какое-то поле есть у всех и какой-то метод есть у всех — он должен быть явно виден на уровне класса, без анализа, что же там за хакерство в конструкторе.


N>А то, что можно это перехакать до неузнаваемости — говорит разве что в пользу того, что только там, где неизвестно, будет атрибут x или нет, надо не описывать его на уровне класса. А в остальных случаях (>>90% практики) — описывать.


N>А теперь представь себе, что конструктор весит 2 экрана, несколько существенно разных веток выполнения и слишком сложно окинуть одним взглядом, чтобы узнать, в какой ветке ji_size задаётся, а в какой — нет...


Ваши аргументы работают в случае предвзятого предположения, что на уровне класса несколько коротких объявлений, а в __init__ почему-то два экрана разных веток. И нет ничего страшного в этой предвзятости, это понятно, потому что вы (зачем-то, вот это мне непонятно) пытаетесь доказать, что использовать аттрибуты классов "лучше". А вот что не нормально, так это то, что вы не рассматриваете противоположный вариант, когда у класса аттрибутов нет, а в __init__ несколько коротких объявлений. Справедливость в споре должна быть или нет?

Пожалуйста, обратите внимание, что после расстановки аргументов за и против, я не делал никаких категоричных выводов, что лучше, что хуже. Наоборот, это было своего рода предложение тихо остановиться. До тех пор, пока программа работает как надо все варианты хороши. Уверен, что мы с лёгкостью прочитаем код друг друга, потому что понимаем как всё работает и не творим откровенный беспредел. Также, я уверен, что вы внезапно не перестанете писать аттрибуты классам, а я не начну. Так к чему этот спор?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.