Форум сайта python.su
4
Приветствую!
Заранее извиняюсь, если слишком нубский вопрос или непонятно, чего хочу. 
Допустим, есть такой код:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- class Block: def __init__(self): self._text = '' self._type = '' class Blocks: def __init__(self): self._blocks = [] def add(self): self._blocks.append(Block()) def transc(self): for block in self._blocks: if block._type == 'comment': block._type = 'transc'
block._type =
self._blocks[i]._type =
block._type =
Отредактировано vanvanov (Апрель 13, 2019 19:49:01)
Офлайн
857
vanvanovВообще неясно, что это за классы. Если поля должны меняться снаружи, то должен быть интерфейс для этого (набор методов, которые может вызывать пользователь у объекта). Если поля не могут меняться снаружи, то метод transc() вообще ничего никогда не сделает, так как все блоки всегда будут пустыми.
и есть ли тут какие-нибудь подводные камни?
Офлайн
4
Если поля не могут меняться снаружи, то метод transc() вообще ничего никогда не сделает, так как все блоки всегда будут пустыми.Ничего не понял. Можете привести пример? У меня блоки не пустые:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- class Block: def __init__(self): self._text = '' self._type = '' class Blocks: def __init__(self): self._blocks = [] def add(self): for i in range(5): self._blocks.append(Block()) def change(self): for i in range(len(self._blocks)): self._blocks[i]._type = str(i) self._blocks[3]._type = 'comment' def transc(self): for block in self._blocks: if block._type == 'comment': block._type = 'transc' def print(self): for i in range(len(self._blocks)): print(i,':',self._blocks[i]._type) def run(self): self.add() self.change() self.transc() self.print() if __name__ == '__main__': Blocks().run()
Так что в идеале Block() должен иметь методы для установки полейУ меня класс Block только хранит параметры, не более. Пользуюсь вместо словаря, потому что словарь в коде выглядит слишком громоздко и не всегда удобен. А здесь я просто вызвал класс, и он создал все нужные мне переменные - я могу не опасаться получить KeyError.
Офлайн
253
vanvanovнадо разбираться а не опасаться.
когда изменение элементов списка внутри класса почему-то не срабатывало
vanvanovТогда не надо подчеркивания ставить первой буквой. Так принято делать для закрытых для доступа полей
Пользуюсь вместо словаря
vanvanovДля этого есть метод get
я могу не опасаться получить KeyError.
>>> a={} >>> a.get(1,2) 2
Офлайн
857
vanvanovТак ты первый код в вопросе вообще другой написал. В самом начале вопроса код вообще бессмысленный.
Ничего не понял. Можете привести пример? У меня блоки не пустые:
vanvanovЗначит они не должны быть приватными, как написал doza_and.
У меня класс Block только хранит параметры, не более.
vanvanovБудет работать, никаких подводных камней тут нет. Поизучай тему привязывания имён в питоне.
Поэтому вопрос: всегда ли будет работать присваивание по типуи есть ли тут какие-нибудь подводные камни?block._type =
Офлайн
4
doza_andЯ в курсе, но как еще различать переменные и методы? Венгерская нотация в Питоне как-то не прижилась. Имхо, отмечать переменные как “закрытые для доступа” достаточно логично, поскольку код яснее, когда какой-либо метод класса возвращает значение, а не когда сторонний класс дергает не свои переменные. К тому же, есть ведь и __такие, и __такие__ закрытые методы. Но это все сугубо мое имхо. Объясните, пожалуйста, как лучше.
Тогда не надо подчеркивания ставить первой буквой. Так принято делать для закрытых для доступа полей
Офлайн
857
vanvanovПрочитай PEP8
Я в курсе, но как еще различать переменные и методы?
Public attributes should have no leading underscores.
…
For simple public data attributes, it is best to expose just the attribute name, without complicated accessor/mutator methods. Keep in mind that Python provides an easy path to future enhancement, should you find that a simple data attribute needs to grow functional behavior. In that case, use properties to hide functional implementation behind simple data attribute access syntax.
vanvanovТы бы читал книги, там бы тебя отослали к PEP'ам. А так ты пытаешься сам догадаться, что и зачем. Потеряешь время только впустую и придёшь всё равно к тому, что в книгах и документации описано.
Объясните, пожалуйста, как лучше.
Отредактировано py.user.next (Апрель 18, 2019 05:22:23)
Офлайн
4
Спасибо за рекомендации.
Только что натолкнулся на пример:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import urllib.parse class Test: def __init__(self,url): self._url = url ''' def quote(self): self._url = list(self._url) for symbol in self._url: if not symbol in (':','/','=','&','?'): symbol = urllib.parse.quote(symbol) self._url = ''.join(self._url) ''' def quote(self): self._url = list(self._url) for i in range(len(self._url)): if not self._url[i] in (':','/','=','&','?'): self._url[i] = urllib.parse.quote(self._url[i]) self._url = ''.join(self._url) def report(self): print('"' + self._url + '"') def run(self): self.quote() self.report() if __name__ == '__main__': Test('https://www.multitran.com/m.exe?l1=2&l2=1&s=компьютер').run()
Офлайн
857
vanvanovПотому что имя symbol сначала привязано к одному объекту, а потом в цикле оно просто перепривязывается к другому объекту. С первым объектом ничего не происходит, от него отвязывается единственное имя и он просто остаётся в списке, каким и был до привязывания имени к нему.
Почему процедура quote работает, а закомментированная процедура - не работает?
>>> n = 1 >>> n 1 >>> n = 2 >>> n 2 >>>
>>> a = b = c = 1 >>> a 1 >>> b 1 >>> c 1 >>>
Отредактировано py.user.next (Апрель 18, 2019 05:45:58)
Офлайн