Уведомления

Группа в Telegram: @pythonsu

#1 Июль 22, 2015 13:58:17

kriofag
Зарегистрирован: 2015-07-22
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Критика, советы и поиск недочетов.

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

class human:
        def __init__(self):
                self.d =  {'name': {'first': '', 'last': ''},
                     'age': '', 
                     'adress': {'home': '', 'street': '', 'town': ''}
                     }
                self.f = list()
        
        
        def setData(self):                                                    
                self.d['name']['first'] = input('Введите имя:     ')
                self.d['name']['last']  = input('Введите фамилию:     ')
                self.d['age'] = input('Введите возраст:     ')
                self.f = input('Введите адрес:     ')      # в формате <город улица дом> через пробел
                self.f = self.f.split(' ')
                self.d['adress']['town']   = self.f[0]
                self.d['adress']['street'] = self.f[1]
                self.d['adress']['home']   = self.f[2]
                return 0
        def getData(self):
                print(self.d.keys())
                print(self.d.values())
newHuman = human()
newHuman.setData()
newHuman.getData()

Офлайн

#2 Июль 22, 2015 14:36:43

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2759
Репутация: +  185  -
Профиль   Отправить e-mail  

Критика, советы и поиск недочетов.

Зачем создавать словари в классе? Делай так:

class human:
    def __init__(self):
        self.first_name = ""
        self.last_name = ""
        self.age = 0
        self.adress = {'home': '', 'street': '', 'town': ''}
    def setAge(self, age):
        self.age=age
newHuman = human()
newHuman.setAge(input('Введите возраст:     '))



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июль 22, 2015 14:37:02)

Онлайн

#3 Июль 22, 2015 15:37:37

J.R.
Зарегистрирован: 2015-07-18
Сообщения: 147
Репутация: +  16  -
Профиль  

Критика, советы и поиск недочетов.

.

Отредактировано J.R. (Фев. 27, 2016 15:54:42)

Офлайн

#4 Июль 22, 2015 22:35:01

kriofag
Зарегистрирован: 2015-07-22
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Критика, советы и поиск недочетов.

Rodegast
Зачем создавать словари в классе? Делай так:
Возможно, так даже и лучше, просто не привык к не жесткому заданию класса)

J.R.
За пример ввода данных и всей структуры огромное спасибо)

Офлайн

#5 Июль 23, 2015 00:54:48

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

Критика, советы и поиск недочетов.

J.R.
Как-то так может быть:
Если класс расчитан на хранение информации, то вводить он ничего не должен. (Методы должны быть чистыми функциями.)
Предположим, что данные поступают не с потока ввода (stdin), а из сокета по сети. Тот класс, который вводит из потока ввода (stdin), невозможно использовать.
Вот так тебе нужно писать новый класс, когда нужно использовать тот, что уже написан.



Отредактировано py.user.next (Июль 23, 2015 00:55:51)

Офлайн

#6 Июль 23, 2015 06:33:37

J.R.
Зарегистрирован: 2015-07-18
Сообщения: 147
Репутация: +  16  -
Профиль  

Критика, советы и поиск недочетов.

.

Отредактировано J.R. (Фев. 27, 2016 15:55:32)

Офлайн

#7 Июль 23, 2015 08:37:13

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

Критика, советы и поиск недочетов.

J.R.
наследуем, и переписываем дандеринит, с учётом источника данных, при этом сохраняя структуру данных.
Что мешает вообще не писать там ввод?

>>> class Human:
...     def __init__(self, name, lastname):
...         self.name = name
...         self.lastname = lastname
...     def __repr__(self):
...         return 'H({}, {})'.format(self.name, self.lastname)
... 
>>> def human_from_string(s):
...     return Human(*s.split(None, 1))
... 
>>> def human_from_input():
...     name = input('Name: ')
...     lastname = input('Lastname: ')
...     return Human(name, lastname)
... 
>>> 
>>> h1 = human_from_string('John Doe')
>>> h2 = human_from_input()
Name: Jane
Lastname: Roe
>>> h1, h2
(H(John, Doe), H(Jane, Roe))
>>>



Офлайн

#8 Июль 23, 2015 09:21:44

J.R.
Зарегистрирован: 2015-07-18
Сообщения: 147
Репутация: +  16  -
Профиль  

Критика, советы и поиск недочетов.

.

Отредактировано J.R. (Фев. 27, 2016 15:55:55)

Офлайн

#9 Июль 23, 2015 13:16:53

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

Критика, советы и поиск недочетов.

J.R.
Есть одна задача с рабочим кодом. Код учебный. Нужно покритиковать
Выкладывай на https://gist.github.com/



Офлайн

#10 Июль 23, 2015 14:56:21

J.R.
Зарегистрирован: 2015-07-18
Сообщения: 147
Репутация: +  16  -
Профиль  

Критика, советы и поиск недочетов.

.

Отредактировано J.R. (Фев. 27, 2016 15:56:12)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version